【问题标题】:Spring Boot logging patternSpring Boot 日志记录模式
【发布时间】:2015-08-14 18:48:55
【问题描述】:

我在 Spring Boot 应用程序中对 Logback 的配置有问题。我希望我的 consoleAppender 看起来像默认的 Spring Boot 控制台附加程序。如何从 Spring Boot 默认控制台 appender 继承模式?

下面是我的consoleAppender配置

<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern class="org.">
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>

【问题讨论】:

标签: spring spring-boot logback


【解决方案1】:

一旦你包含了默认配置,你就可以在你自己的logback-spring.xml配置中使用它的值:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!-- use Spring default values -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    …
</configuration>

【讨论】:

  • 最简单的方法!,不错
  • 不要忘记添加&lt;root level="INFO"&gt;&lt;appender-ref ref="CONSOLE"/&gt;&lt;/root&gt;,否则您将不会得到任何记录
  • 正如 jediz 上面所说,除非您添加 &lt;root level="INFO"&gt;&lt;appender-ref ref="CONSOLE"/&gt;&lt;/root&gt;,否则此解决方案不会记录任何内容
  • 您可能还想在 &lt;configuration&gt; 中为异常日志消息中的包名称添加 packagingData="true",因为它是 Spring Boot 日志记录的默认设置。
  • 如果希望使用 Spring 默认值,那么也可以使用默认值 utf8 来代替 CONSOLE_LOG_CHARSET
【解决方案2】:

您可以在 defaults.xml 文件中找到 Spring Boot logback 控制台日志记录模式:

spring-boot-1.5.0.RELEASE.jar/org/springframework/boot/logging/logback/defaults.xml

控制台模式:

<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

【讨论】:

【解决方案3】:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx
            </Pattern>
        </layout>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

【讨论】:

  • 这些转换规则是否应该将弹簧定义的颜色带入 logback?它不适合我
【解决方案4】:

这个问题被问到已经有一段时间了,但是由于我最近自己遇到了这个问题并且找不到答案,所以我开始深入挖掘并找到了一个适合我的解决方案。

我最终使用了调试器并查看了附加到记录器的默认附加程序。

我发现这种模式对我来说很有效:

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p 18737 --- [%t] %-40.40logger{39} : %m%n%wEx</pattern>

编辑:该模式并不完全正确,我看到运行时一些值已经被实例化(在本例中为 18737 ---)我将寻找适当的变量来替换那里。它确实包含固定长度列的格式

编辑 2:好的,我又看了一下调试器的内容。您也可以通过查看记录器实例的内容来自己完成此操作: Debugger(eclipse) Logger Contents

所以我最终使用了 consoleAppender 中使用的模式:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(18971){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx

可以在这里看到:

Debugger: detailed contents of the encoder pattern

【讨论】:

  • 谢谢,在其他答案中,我使用此模式添加了完整的工作 logback.xml。它需要 spring default.xml 中的 conversionRules 元素才能工作。
  • 为什么在模式中有明确的18971 值?这不是一个有意义的变量,在不同的启动之间会发生变化吗?
【解决方案5】:

可以使用 application.properties 文件配置日志记录模式

例子:

# Logging pattern for the console
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n

【讨论】:

    【解决方案6】:

    您可以使用以下模式:

    %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} --- [%15.15t] %-40.40logger{1.} : %m%n%wEx
    

    【讨论】:

      【解决方案7】:

      对于那些想使用 Łukasz Frankowski 的答案(这里看起来是最干净的解决方案)的人,但在常规版本中,“有问题的”{$PID:- } 部分可以扩展如下:

      logback-spring.groovy

      import ch.qos.logback.classic.PatternLayout
      import ch.qos.logback.core.ConsoleAppender
      import org.springframework.boot.logging.logback.ColorConverter
      import org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter
      import org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter
      
      import static ch.qos.logback.classic.Level.INFO
      
      conversionRule("clr", ColorConverter)
      conversionRule("wex", WhitespaceThrowableProxyConverter)
      conversionRule("wEx", ExtendedWhitespaceThrowableProxyConverter)
      
      appender("STDOUT", ConsoleAppender) {
          layout(PatternLayout) {
              def PID = System.getProperty("PID") ?: ''
              pattern = "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"
          }
      
      }
      root(INFO, ["STDOUT"])
      

      【讨论】:

        【解决方案8】:

        请注意,您还可以自定义导入的属性。

        但请注意,至少在 spring boot 1.4.3 中,如果要自定义从 defaults.xml 导入的属性,则应将自定义放在 include 之前。

        例如,这将优先级自定义为 100 个字符宽:

        <configuration scan="true">
            <property name="LOG_LEVEL_PATTERN" value="%100p" />
        
            <!-- use Spring default values -->
            <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        
            <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                </layout>
            </appender>
        
            <logger name="hu" level="debug" additivity="false">
                <appender-ref ref="CONSOLE" />
            </logger>
        
            <root level="warn">
                <appender-ref ref="CONSOLE" />
            </root>
        
        </configuration>
        

        但这不是:

        <configuration scan="true">
            <!-- use Spring default values -->
            <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
            <property name="LOG_LEVEL_PATTERN" value="%100p" />
        
            <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                </layout>
            </appender>
        
            <logger name="hu" level="debug" additivity="false">
                <appender-ref ref="CONSOLE" />
            </logger>
        
            <root level="warn">
                <appender-ref ref="CONSOLE" />
            </root>
        
        </configuration>
        

        【讨论】: