系统 属性 未被 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