【发布时间】: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