系统 属性 未被 log4j2 -> lo4j1 桥读取
System property not being read by log4j2 -> lo4j1 bridge
我正在开发一个大型 java 基于 Web 的项目,该项目基于一些旧版本的 Spring 和 Hibernate,并使用 log4j 1.2x。由于最近在 log4j2 中发现漏洞,我们已被指示升级到最新版本的 log4j2。我正在尝试实现 log4j2 log4j1 桥,这样我就不必更新应用程序中的所有日志记录代码。一切正常,除了我无法指定存储日志文件的位置,因为 log4j1 桥似乎不支持系统属性。我在启动我的 tomcat 服务器时传入 ${catalina.base} 属性,但是 log4j1 桥使用文字文本而不是替换属性 值。
我的专家pom.xml
...
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.17.1</version>
</dependency>
...
我引用系统的 log4j.xml 文件部分 属性:
log4j-dev.xml
...
<appender name="DAILY" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${catalina.base}/logs/etl.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="GATEWAY: %p %d [%t] %c{1}.%M(%L) | %m%n"/>
</layout>
</appender>
...
我定义要使用哪个 log4j.xml 的 setenv.bat 条目:
-Dlog4j2.debug=true -Dlog4j.configuration=log4j-dev.xml
tomcat 日志中显示的属性说明正在向 log4j1 桥
提供有问题的系统 属性
...
Command line argument: -Dlog4j2.debug=true
Command line argument: -Dlog4j.logDir=C:\dev\apache-tomcat-8.5.50\logs
Command line argument: -Dlog4j.configuration=log4j-dev.xml
Command line argument: -Dcatalina.base=C:\dev\apache-tomcat-8.5.50
Command line argument: -Dcatalina.home=C:\dev\apache-tomcat-8.5.50
Command line argument: -Djava.io.tmpdir=C:\dev\apache-tomcat-8.5.50\temp
...
以及日志中显示成功创建日志文件的位置以及它使用的路径的部分:
...
DEBUG StatusLogger Class name: [org.apache.log4j.RollingFileAppender]
DEBUG StatusLogger Parsing layout of class: "org.apache.log4j.PatternLayout"
DEBUG StatusLogger PluginManager 'Converter' found 47 plugins
TRACE StatusLogger New file '${catalina.base}/etl.log' created = true
DEBUG StatusLogger Returning file creation time for C:\dev\apache-tomcat-8.5.50\bin${catalina.base}\etl.log
DEBUG StatusLogger Starting RollingFileManager ${catalina.base}/etl.log
...
日志文件正在名为“${catalina.base}”的文件夹中创建,在我启动时所在的任何目录中 tomcat。如何让 log4j1 桥识别系统 属性 的 值 而不是使用文字 属性 名称?
我做错了什么? TIA 任何人都可以提供的任何建议。
除非我记错了,否则这是支持 Log4j 1.x XML 配置的错误。 this commit 中引入了对 Log4j 1.x 变量替换的支持(它仅在您使用 org.apache.log4j.config.Log4j1ConfigurationFactory
时才有效,这不是默认设置)用于属性格式,但对 XML 格式丢失。你应该报告它。
在此期间,您可以使用 ${sys:catalina.base}
作为解决方法(基本上 Log4j 1.x 桥支持 Log4j 2.x 查找,而不是简单的系统 属性替换).
编辑: Log4j 1.x 桥有三个配置工厂:
Log4j1ConfigurationFactory
仅支持 *.properties
文件,并且自上述提交(2016 年)以来一直使用 属性 替换,
- 如 Paul 在评论中所述,
LOG4J2-2951
中添加了 PropertiesConfigurationFactory
中对 属性 替换的支持,
XmlConfigurationFactory
中缺少对 属性 替换的支持,据 Paul 报道为 LOG4J2-3328
。
我正在开发一个大型 java 基于 Web 的项目,该项目基于一些旧版本的 Spring 和 Hibernate,并使用 log4j 1.2x。由于最近在 log4j2 中发现漏洞,我们已被指示升级到最新版本的 log4j2。我正在尝试实现 log4j2 log4j1 桥,这样我就不必更新应用程序中的所有日志记录代码。一切正常,除了我无法指定存储日志文件的位置,因为 log4j1 桥似乎不支持系统属性。我在启动我的 tomcat 服务器时传入 ${catalina.base} 属性,但是 log4j1 桥使用文字文本而不是替换属性 值。
我的专家pom.xml
...
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.17.1</version>
</dependency>
...
我引用系统的 log4j.xml 文件部分 属性:
log4j-dev.xml
...
<appender name="DAILY" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${catalina.base}/logs/etl.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="GATEWAY: %p %d [%t] %c{1}.%M(%L) | %m%n"/>
</layout>
</appender>
...
我定义要使用哪个 log4j.xml 的 setenv.bat 条目:
-Dlog4j2.debug=true -Dlog4j.configuration=log4j-dev.xml
tomcat 日志中显示的属性说明正在向 log4j1 桥
提供有问题的系统 属性...
Command line argument: -Dlog4j2.debug=true
Command line argument: -Dlog4j.logDir=C:\dev\apache-tomcat-8.5.50\logs
Command line argument: -Dlog4j.configuration=log4j-dev.xml
Command line argument: -Dcatalina.base=C:\dev\apache-tomcat-8.5.50
Command line argument: -Dcatalina.home=C:\dev\apache-tomcat-8.5.50
Command line argument: -Djava.io.tmpdir=C:\dev\apache-tomcat-8.5.50\temp
...
以及日志中显示成功创建日志文件的位置以及它使用的路径的部分:
...
DEBUG StatusLogger Class name: [org.apache.log4j.RollingFileAppender]
DEBUG StatusLogger Parsing layout of class: "org.apache.log4j.PatternLayout"
DEBUG StatusLogger PluginManager 'Converter' found 47 plugins
TRACE StatusLogger New file '${catalina.base}/etl.log' created = true
DEBUG StatusLogger Returning file creation time for C:\dev\apache-tomcat-8.5.50\bin${catalina.base}\etl.log
DEBUG StatusLogger Starting RollingFileManager ${catalina.base}/etl.log
...
日志文件正在名为“${catalina.base}”的文件夹中创建,在我启动时所在的任何目录中 tomcat。如何让 log4j1 桥识别系统 属性 的 值 而不是使用文字 属性 名称?
我做错了什么? TIA 任何人都可以提供的任何建议。
除非我记错了,否则这是支持 Log4j 1.x XML 配置的错误。 this commit 中引入了对 Log4j 1.x 变量替换的支持(它仅在您使用 org.apache.log4j.config.Log4j1ConfigurationFactory
时才有效,这不是默认设置)用于属性格式,但对 XML 格式丢失。你应该报告它。
在此期间,您可以使用 ${sys:catalina.base}
作为解决方法(基本上 Log4j 1.x 桥支持 Log4j 2.x 查找,而不是简单的系统 属性替换).
编辑: Log4j 1.x 桥有三个配置工厂:
Log4j1ConfigurationFactory
仅支持*.properties
文件,并且自上述提交(2016 年)以来一直使用 属性 替换,- 如 Paul 在评论中所述,
LOG4J2-2951
中添加了PropertiesConfigurationFactory
中对 属性 替换的支持, XmlConfigurationFactory
中缺少对 属性 替换的支持,据 Paul 报道为LOG4J2-3328
。