我正在開發一個大型的基于 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 橋識別系統屬性的值而不是使用文字屬性名稱?
我究竟做錯了什么?TIA 任何人都可以提供的任何建議。
uj5u.com熱心網友回復:
除非我弄錯了,否則這是對 Log4j 1.x XML 配置的支持中的一個錯誤。此提交中引入了對 Log4j 1.x 變數替換的支持(僅當您使用org.apache.log4j.config.Log4j1ConfigurationFactory,這不是默認值時才有效)用于屬性格式,但缺少對 XML 格式的等效更改。你應該報告它。
與此同時,您可以將${sys:catalina.base}其用作一種解決方法(基本上 Log4j 1.x 橋支持Log4j 2.x查找,而不是簡單的系統屬性替換)。
編輯: Log4j 1.x 橋有三個配置工廠:
Log4j1ConfigurationFactory僅支持*.properties檔案,并且自上述提交(2016 年)以來一直在使用屬性替換,- 正如保羅在評論中提到的那樣,
PropertiesConfigurationFactory添加了對屬性替換的支持,LOG4J2-2951 XmlConfigurationFactory保羅報告說,缺乏對財產替代的支持LOG4J2-3328。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410505.html
標籤:
