Spring引导logback.xml外化

Spring boot logback.xml externalisation

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

logging.config=file:${CONFIG_HOME}apilogback.xml

CONFIG_HOME 将是指向所有配置文件的公共位置的环境变量。给 CONFIG_HOME 的示例值是 C:/SWS/apache-tomcat-8.5.16/appconfig/ 当我 运行 我的 API 使用 tomcat 而不是获取 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 的值

.

设置环境变量 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 and 9.0.34) 的最新版本中得到纠正,其中变量已重命名 CATALINA_LOGGING_CONFIG.

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

set LOGGING_CONFIG=foobar

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

LOGGING_CONFIG=foobar

仅适用于当前的 shell,如果您想将其导出到子进程(以及使用 exec 创建的子进程),您必须使用:

export LOGGING_CONFIG

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