Spring 引导日志模式

Spring Boot logging pattern

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

下面是我的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>

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

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

我发现这个模式对我来说很管用:

<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

您可以在 defaults.xml 文件中找到 Spring 启动 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}}"/>

包含默认配置后,您可以在自己的 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>
<?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>

对于那些想使用 Łukasz Frankowski 的答案(这看起来是这里最干净的解决方案)的人,但在 groovy 版本中,"problematic" {$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"])

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

示例:

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

您可以使用以下模式:

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

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

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

例如,将优先级自定义为 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>

如果您使用 application.yml 作为您的配置,您可以这样设置日志模式:

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} | %-5level | %logger{1.} | %msg%n"
  level:
    org.springframework: WARN
    com.ulisesbocchio.jasyptspringboot: WARN
    com.example.test: DEBUG

您可以在命令行上覆盖日志记录级别。例如:

$ java -Dlogging.level.com.example.test=TRACE -jar my-example.jar