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 外部化的主要内容,如果未能解决你的问题,请参考以下文章
-Dlogback.configurationFile=logback.xml 在运行 Spring-Boot 时被忽略