spring boot, logback and logging.config 属性

2022-08-31 14:54:39

我正在使用logback库在Spring Boot项目中实现日志记录。我想根据我的spring配置文件(属性'spring.pofiles.active')加载不同的日志记录配置文件。我有3个文件:logback-dev.xml,logback-inte.xml和logback-prod.xml。我使用的是弹簧引导版本1.2.2.RELEASE。

正如您在春季启动文档中阅读的那样

通过在类路径上包含适当的库,可以激活各种日志记录系统,并通过在类路径的根目录中或在Spring Environment属性loging.config指定的位置提供合适的配置文件来进一步自定义。(但请注意,由于日志记录是在创建 ApplicationContext 之前初始化的,因此无法从 Spring @Configuration 文件中@PropertySources来控制日志记录。系统属性和传统的 Spring Boot 外部配置文件工作正常。

所以我试图在我的应用程序.属性文件中设置'logging.config'属性:

logging.config=classpath:/logback-${spring.profiles.active}.xml

但是当我启动我的应用程序时,我的logback-{profile}.xml没有加载...

我认为日志记录是所有使用spring boot的项目都遇到的常见问题。采用上述方法,我是否走在正确的轨道上?我有其他可行的解决方案,但我发现它们不那么优雅(在logback中使用Janino进行条件解析.xml文件或命令行属性)。


答案 1

我找到了一个解决方案,我明白了为什么spring不使用文件中定义的'logging.config'属性。application.properties

解决方案和说明:

初始化日志记录时,spring Boot 仅查找类路径或环境变量

我使用的解决方案是包含一个父 logback.xml文件,该文件根据 spring 配置文件包含正确的日志记录配置文件。

日志返回.xml :

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

logback-[profile].xml(在本例中为 logback-dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

注意:启动应用程序时,必须在命令行参数中设置“spring.profiles.active”。例如,对于JVM属性:-Dspring.profiles.active=dev

参考文档 :

编辑(多个活动配置文件):为了避免多个文件,我们可以使用需要Janino依赖性的条件处理(在此处设置),请参阅条件文档。使用此方法,我们还可以同时检查多个活动配置文件。例如(我没有测试这个解决方案,所以如果它不起作用,请评论):

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

有关条件处理的另一个示例,请参阅 javasenior 答案。


答案 2

可以处理多个配置文件的另一种方法是为每个环境创建一个单独的属性文件。

application-prod.properties

logging.config=classpath:logback-prod.xml

应用程序开发属性

logging.config=classpath:logback-dev.xml

应用程序-本地.属性

logging.config=classpath:logback-local.xml

注意

如果你不小心,你最终可能会在意想不到的地方记录

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml

推荐