当前位置: 首页 > 知识库问答 >
问题:

log4j2->lo4j1网桥未读取系统属性

怀展
2023-03-14

我正在从事一个基于java web的大型项目,该项目基于Spring和Hibernate的一些旧版本,并使用log4j 1.2x。由于最近在log4j2中发现了漏洞,我们已被指示升级到log4j2的最新版本。我正在尝试实现log4j2log4j1桥,这样就不必更新应用程序中的所有日志代码。除了我无法指定日志文件的存储位置外,一切都正常,因为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桥识别系统属性的值,而不是使用文本属性名?

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

共有1个答案

卞成荫
2023-03-14

除非我弄错了,否则这是支持log4j1的一个bug。x XML配置。对log4j1的支持。此提交中为属性格式引入了x变量替换(仅当您使用org.apache.log4j.config.Log4j1ConfigurationFactory(这不是默认值)时,它才起作用,但缺少对XML格式的等效更改。你应该报告。

同时,您可以使用 ${sys:catalina.base}作为解决方法(基本上,log4j1.x桥支持log4j2.x查找,而不是简单的系统属性替换)

编辑:log4j1。x桥有三个配置工厂:

  • log4j1配置工厂仅支持*。属性文件,并且自上述提交(2016年)以来一直在使用属性替换,
  • 正如Paul在评论中提到的,
  • Paul将XmlConfigurationFactory中缺少对属性替换的支持报告为LOG4J2-3328
 类似资料:
  • 我试图从系统属性中读取日志配置中的变量,但没有成功。我定义了一个非常简单的logback.groovy,如下所示: 然后是一个简单的test.scala: 注意,当我在日志文件中定义USER_HOME时,它工作得很好

  • 问题内容: 有没有更好的方法可以从命令行打印系统属性?由于我们可以设置属性,例如 不用写课就能做到吗? 如果不可能的话,为什么不能/可行/好用命令行呢? 问题答案: 您可以在Hotspot JVM 1.7版及更高版本(1.6版不支持)中使用该标志: 自2010年底以来,OpenJDK就一直支持该标志。 在http://marxsoftware.blogspot.de/2016/02/hotspot

  • 您好,我最近在spring项目中将日志记录从log4j迁移到了log4j2。 一切正常,但我想知道如何设置属性

  • 我有一个Spring Boot应用程序如下: 我正在使用spring配置文件,并根据活动配置文件加载一个正确的特定环境文件:utils-local.properties、utils-dev.properties等。 当通过application.properties(spring)设置配置文件时,例如spring.profiles.active=local all工作良好,将加载正确的文件(uti

  • 本文向大家介绍Bootstrap源码解读网格系统(3),包括了Bootstrap源码解读网格系统(3)的使用技巧和注意事项,需要的朋友参考一下 源码解读Bootstrap网格系统 工作原理 数据行(.row)必须包含在容器(.container)中,以便为其赋予合适的对齐方式和内距(padding)。如: .container的实现源码: 在行中可以添加列,但列数之和不能超过平分的总列数,比如12

  • 为了测试结果,我安装了JDK8.91(没有安装JRE8.91)和JRE8.77。此外,我还创建了JRE_HOME、JAVA_HOME变量,排除了JDK文件夹中的路径变量。 我的Tomcat使用JRE,所以我希望在启动它之前获得当前的JRE版本。我找到了如下解决方法: 执行后 链接:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/syst