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
。
我正在创建一个 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
。