【问题标题】:System property not being read by log4j2 -> lo4j1 bridgelog4j2 未读取系统属性-> lo4j1 网桥
【发布时间】:2022-01-08 00:19:54
【问题描述】:

我正在开发一个大型的基于 Web 的 Java 项目,该项目基于一些旧版本的 Spring 和 Hibernate,并使用 log4j 1.2x。由于最近在 log4j2 中发现的漏洞,我们已被指示升级到最新版本的 log4j2。我正在尝试实现 log4j2 log4j1 桥,这样我就不必更新应用程序中的所有日志记录代码。一切正常,除了我无法指定存储日志文件的位置,因为 log4j1 网桥似乎不支持系统属性。我在启动我的 tomcat 服务器时传入了一个 ${catalina.base} 属性,但是 log4j1 桥使用文字文本而不是替换属性值。

我的maven 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 桥识别系统属性的,而不是使用文字属性名称?

我做错了什么?任何人都可以提供的任何建议。

【问题讨论】:

    标签: java tomcat logging log4j log4j2


    【解决方案1】:

    除非我弄错了,这是 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 在 cmets 中提到的,LOG4J2-2951 中添加了对 PropertiesConfigurationFactory 中的属性替换的支持,
    • Paul 已将 XmlConfigurationFactory 中的属性替换支持报告为 LOG4J2-3328

    【讨论】:

    • Piotr,使用 ${sys:catalina.base} 对我根本不起作用。我有一个例外。我已将原始问题报告为错误。谢谢你的建议。
    • 当然,两天后,显而易见的答案是将 log4j.xml 文件更改为 log4j.properties 文件,因为 log4j 团队刚刚修复了属性文件的这个问题。
    猜你喜欢
    • 2015-03-02
    • 2018-03-25
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多