[英]Merge logging config of Spring boot and Logback
我有以下情况:使用 logback 的 spring boot 应用程序和application.yml
中已经配置的几个日志记录属性
我想添加只能通过logback.xml
文件获得的其他配置选项,但是只要我将此文件添加到类路径(不管它是命名为logback.xml
还是logback-spring.xml
),它就会覆盖所有来自application.yml
以及在那里定义的所有日志记录级别/模式和其他选项停止生效 - 添加logback.xml
后, appication.yml
中的所有选项都被忽略,我需要在 xml 文件而不是 yml 中读取它们。
我的问题是:是否可以合并这两个配置? 我的意思是我只需要向 logback.xml 添加一个选项,并且我不想强迫每个其他开发人员学习 logback.xml 语法,而他们已经熟悉application.yml
配置日志记录的方式。
更新1
我想做的一件事是启用 logback JMX 访问,因此我创建了一个包含以下内容的logback-spring.xml
文件:
<configuration debug="true">
<jmxConfigurator />
</configuration>
在我引入这个文件之后,即使我在application.yml
文件中有logging.level.root: info
,我也会丢失 webapp 的所有日志记录。
我还想继续使用在application.yml
中定义的根日志记录级别和模式。 我还想配置几个特定于 logback 的turboFilters
,据我所知,只能通过 logback 配置文件来定义。
更新 2
@devatherock 和 @Ashish Patil asnwers 都帮助我解决了这个问题,我已经意识到可以通过springProperty
在logback.xml
中包含弹簧配置元素,但我还没有将其视为可行的解决方案,因为我必须重写多个元素这种方式使logback.xml
更难阅读。
但是正如@devatherock 所提到的 - 默认情况下,配置文件是合并的,它是 logback 需要在其配置中存在 appender 和 root 记录器。 即使存在于logback.xml
文件中,根记录器级别仍将被application.yml
设置覆盖(这是所需的),但pattern
属性不会,我们必须为此使用springProperty
。
因此,虽然这两个答案都很有帮助,但实际上@devatherock 的 insignts 对我更有帮助,我也接受了他的回答。
我创建了一个示例项目spring-boot-logback ,它在logback.xml
和application.yml
中指定日志配置
root
日志级别在 logback.xml 中设置为WARN
,如下所示:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="WARN">
<appender-ref ref="STDOUT" />
</root>
</configuration>
有一个处理/hello
的控制器方法,带有一个DEBUG
和一个INFO
日志行。 控制器类的日志级别在application.yml
文件中设置为DEBUG
,如下所示:
logging:
level:
io.github.devatherock.demo.controller: DEBUG
我启动了应用程序并点击了/hello
控制器端点。 以下是我看到的日志行:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.7)
08:41:45.051 [http-nio-8080-exec-1] DEBUG i.g.d.d.controller.HelloController - Debug log in sayHello method
08:41:45.052 [http-nio-8080-exec-1] INFO i.g.d.d.controller.HelloController - Info log in sayHello method
由于根日志级别在 logback.xml 中设置为 WARN,因此不存在任何应用程序启动日志。 来自控制器的调试和信息日志行都存在,因为控制器日志级别已在 application.yml 中设置为 DEBUG。 因此,我们可以确认来自 logback.xml 和 application.yml 的日志记录配置均已应用,没有任何问题
更新1:
看起来如果指定了logback.xml
,它至少需要有 appender、encoder 和 appender 到根日志级别的附件,以便使用 spring boot 的logging.*
属性覆盖日志配置。 一旦我用 jmxConfigurator 指定了这样的logback.xml
文件,我就能够在jmxConfigurator
application.yml
调整根和控制器日志级别。 新的logback.xml
和application.yml
文件如下:
带有 jmxConfigurator 的 logback.xml:
<configuration>
<jmxConfigurator />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
具有根日志级别的 application.yml:
logging:
level:
root: WARN
io.github.devatherock.demo.controller: DEBUG
使用springProperty可能适合您的要求。
比方说,你有application.yml
如下所示:
logging:
level:
root: DEBUG
... // other configs
现在,即使在拥有logback.xml
之后,您也想强制执行 application.yml 的配置,然后您可以在logback.xml
springProperty
<configuration>
<jmxConfigurator />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<springProperty scope="context" name="loggerProperty" source="logging.level.root"/>
<root level="${loggerProperty}">
<appender-ref ref="STDOUT" />
</root>
... //other configurations.
</configuration>
现在,当您启动 spring-boot 时,您可以看到 application.yml 的配置值被读取而不是覆盖。
因此,通过这种方式,您可以在logback
和application.yml
中配置尽可能多的属性。
基本上,您从 logback 中引用Environment
属性(在 application.properties / application.yml 中定义)。
这里logging.level.root
是定义application.yml
的环境属性,您在logback.xml
中通过将其命名为loggerProperty
来引用它。 然后,您将在 logback 中使用此loggerProperty
,以便使用它而不是 logback 的默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.