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>
【讨论】:
最简单的方法!,不错 不要忘记添加<root level="INFO"><appender-ref ref="CONSOLE"/></root>
,否则您将不会得到任何记录
正如 jediz 上面所说,除非您添加 <root level="INFO"><appender-ref ref="CONSOLE"/></root>
,否则此解决方案不会记录任何内容
您可能还想在 <configuration>
中为异常日志消息中的包名称添加 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 Aop实现日志记录功能