Spring Boot logback.xml 外部化

Posted

技术标签:

【中文标题】Spring Boot logback.xml 外部化【英文标题】:Spring boot logback.xml externalisation 【发布时间】:2021-09-01 12:59:59 【问题描述】:

我正在创建一个 Spring-boot 应用程序,我想在其中外部化 logback 文件。我这样做的原因是为了让消费者灵活地决定他们将在哪个位置获取 API 日志。为了实现这一点,我在 application.properties 中添加了 logging.config 条目,如下所示

logging.config=file:$CONFIG_HOMEapilogback.xml

CONFIG_HOME 将是一个环境变量,它指向所有配置文件的公共位置。 CONFIG_HOME 的示例值为 C:/SWS/apache-tomcat-8.5.16/appconfig/ 当我使用 tomcat 运行我的 API 而不是获取 application.properties 文件中提到的 logging.config 的值时,它正在获取 catalina.bat 中定义的默认值。 catalina.bat 中的默认值如下:

LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

令我惊讶的是,这在 unix 环境中运行时似乎运行良好,但在 windows 环境中却没有。 有没有办法确保我们从我的 API 的 application.properties 加载 logging.config 的值。

.

【问题讨论】:

【参考方案1】:

设置环境变量LOGGING_CONFIG 会有效地覆盖application.properties 中的值(参见Externalized Configuration)。您所能做的就是在具有更高优先级的源中设置值,例如作为系统属性:

try 
    if (System.getProperty("logging.config") == null) 
        final String config_home = System.getenv("CONFIG_HOME");
        if (config_home != null) 
            System.setProperty("logging.config", "file://" + configHome + "/apilogback.xml");
        
    
 catch (AccessControlException ex) 
    // SecurityManager in place...

不过,catalina.sh/catalina.bat 使用的环境变量与 Spring 之间的名称冲突已在 Tomcat 的最新版本(8.5.54 和 9.0.34)中得到纠正,其中变量重命名为 CATALINA_LOGGING_CONFIG

该问题仅影响 Windows(并且如果您使用 catalina.bat/startup.bat,通过 procrun 将 Tomcat 作为服务运行不受影响),因为批处理文件不会有一个local环境变量的概念:

set LOGGING_CONFIG=foobar

在 Windows 上将环境变量导出到所有子进程。在 UNIX 上:

LOGGING_CONFIG=foobar

仅对当前 shell 可用,如果要将其导出到子进程(以及使用 exec 创建的进程),则必须使用:

export LOGGING_CONFIG

备注:您应该以不同的方式调用环境变量,例如<your application's name>_CONFIG_HOME> 这样您就可以确保不会覆盖另一个应用程序使用的变量。更好的是,使用 Spring 配置属性,这样您就可以通过多种方式设置 CONFIG_HOME

【讨论】:

我在我的机器上使用的是tomcat 8.5.16,在阅读了您的回复后,我切换到了tomcat 8.5.54,它工作正常。我试图找出这个问题将近 2 天。非常感谢您的解决方案。

以上是关于Spring Boot logback.xml 外部化的主要内容,如果未能解决你的问题,请参考以下文章

xml Spring Boot简单的logback.xml

-Dlogback.configurationFile=logback.xml 在运行 Spring-Boot 时被忽略

Spring Boot配置保存日志文件

Spring Boot logback.xml 外部化

spring boot 默认的 logback

Spring Boot中实现logback多环境日志配置