spring boot、logback 和 logging.config 属性

新手上路,请多包涵

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

正如您在 Spring Boot 文档 中所读到的:

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

所以我尝试在我的 application.properties 文件中设置“logging.config”属性:

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

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

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

原文由 LG_ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

我找到了一个解决方案,并且我理解了为什么 spring 不使用在 application.properties 文件中定义的我的 ‘logging.config’ 属性。

解决方案和解释:

初始化日志记录时,spring Boot 只查看 classpath 或 environment variables

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

logback.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 属性的 EG: -Dspring.profiles.active=dev

参考文档:

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

 <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 answer。

原文由 LG_ 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

应用产品.properties

 logging.config=classpath:logback-prod.xml

应用程序-dev.properties

 logging.config=classpath:logback-dev.xml

application-local.properties

 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

原文由 Zergleb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题