繁体   English   中英

合并 Spring boot 和 Logback 的日志配置

[英]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 都帮助我解决了这个问题,我已经意识到可以通过springPropertylogback.xml中包含弹簧配置元素,但我还没有将其视为可行的解决方案,因为我必须重写多个元素这种方式使logback.xml更难阅读。

但是正如@devatherock 所提到的 - 默认情况下,配置文件合并的,它是 logback 需要在其配置中存在 appender 和 root 记录器。 即使存在于logback.xml文件中,根记录器级别仍将被application.yml设置覆盖(这是所需的),但pattern属性不会,我们必须为此使用springProperty

因此,虽然这两个答案都很有帮助,但实际上@devatherock 的 insignts 对我更有帮助,我也接受了他的回答。

我创建了一个示例项目spring-boot-logback ,它在logback.xmlapplication.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.xmlapplication.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 的配置值被读取而不是覆盖。

因此,通过这种方式,您可以在logbackapplication.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM