Spring Boot 日志记录模式

Posted

技术标签:

【中文标题】Spring Boot 日志记录模式【英文标题】:Spring Boot logging pattern 【发布时间】: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.">
            %dyyyy-MM-dd HH:mm:ss [%thread] %-5level %logger36 - %msg%n
        </Pattern>
    </layout>
</appender>

【问题讨论】:

也许您应该关注问题github.com/spring-projects/spring-boot/issues/1788 - 这可能会在关闭时为您提供解决方案。 【参考方案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(%dyyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) %clr($PID:- )magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"/>

【讨论】:

LOG_EXCEPTION_CONVERSION_WORD 是做什么的? 这个模式经过一些变量替换导致不同的模式 github.com/spring-projects/spring-boot/blob/main/…【参考方案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(%dyyyy-MM-dd HH:mm:ss.SSS)faint %clr(%5p) %clr($PID:- )magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n%wEx
            </Pattern>
        </layout>
    </appender>

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

</configuration>

【讨论】:

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

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

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

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

<pattern>%dyyyy-MM-dd HH:mm:ss.SSS %5p 18737 --- [%t] %-40.40logger39 : %m%n%wEx</pattern>

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

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

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

%clr(%dyyyy-MM-dd HH:mm:ss.SSS)faint %clr(%5p) %clr(18971)magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)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=%dyyyy-MM-dd HH:mm:ss - %msg%n

【讨论】:

【参考方案6】:

您可以使用以下模式:

%dyyyy-MM-dd HH:mm:ss.SSS %5p $sys:PID --- [%15.15t] %-40.40logger1. : %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(%dyyyy-MM-dd HH:mm:ss.SSS)faint %clr(%5p) %clr($PID)magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)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>

【讨论】:

以上是关于Spring Boot 日志记录模式的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 之日志记录

Spring Boot 中使用Spring Aop实现日志记录功能

Spring Boot - 记录日志

Spring Boot 日志记录覆盖颜色

Spring boot - 如何获取 WARN 的框架日志记录和 DEBUG 的应用程序日志记录

Spring Boot 日志记录中的 ClassCastException