[英]log4j 2 - configuration issue
我正在嘗試配置 log4j 2.0 來報告日志。
我的配置保存為 log4j2.xml,這是它的內容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration name="PRODUCTION" status="OFF">
<appenders>
<RollingFile name="MyFileAppender"
fileName="../Logs/app.log"
filePattern="../Logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="MyFileAppender"/>
</root>
</loggers>
</configuration>
它存在於項目的類路徑中,我嘗試將它放在許多其他目錄中。
我在代碼中創建了一個記錄器,如下所示:
Logger logger = LogManager.getLogger(MyClass.class.getName());
logger.info("test");
沒有寫入任何文件,也沒有創建文件。 當我調試代碼時,我看到記錄器是默認記錄器(控制台)。
實際上,這是一個直截了當的過程。 Log4j 2 的兩個主要類如下,您需要像這樣導入:
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
現在使用此代碼獲取Logger
實例。
private static final Logger logger = LogManager.getLogger();
注意我沒有指定getLogger()
方法的類名作為參數。 Log4j 2 會自動計算出來。
現在您可以使用Logger
類中的任何info(), trace(), debug(), warn(), error(), fatal()
方法。 但是要獲得所有這些方法的輸出,您需要一個 XML 配置文件。 默認情況下,Log4j 2 只從error() and fatal()
方法產生輸出。
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="MyCustomLogFile" fileName="/home/me/mylogfile.log">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
</File>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="MyCustomLogFile"/>
<!--<AppenderRef ref="Console"/>-->
</Root>
</Loggers>
</Configuration>
在任何地方以任何名稱保存此文件。 我使用 Log4j2.xml 作為名稱。 現在您需要將此文件放在類路徑中,您可以通過在運行程序時傳遞系統屬性來實現,如下所示:
java -Dlog4j.configurationFile=/path/to/xml/configuration/file/Log4j2.xml MyMainClass
你已經做到了。 日志將立即出現在您的控制台上。
特別說明:
在 XML 文件中,我提供了 2 個 appender:一個文件和一個控制台。 您可以看到您只需要取消注釋AppenderRef
標記的注釋即可在文件而不是控制台中獲得輸出。
您還可以提供環境變量作為系統屬性。 如果沒有找到環境變量,Log4j 2 將首先從環境變量中讀取配置文件,然后在-D
參數中讀取。
玩得開心。 :-)
將log4j2.xml
文件放在src/main/resources
。 有用
您應該將 log4j2.xml 放入類路徑中。
或設置“log4j.configurationFile”系統屬性以強制使用您的 log4j2.xml
請參考: http : //logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
它存在於項目的類路徑中,我嘗試將它放在許多其他目錄中。
具體在哪里? 人們常常對“在類路徑中”的含義感到困惑。 它不能只是在任何地方。 它必須位於“頂部”或“默認包”。
src
├── main
│ └── java
│ ├── com
│ │ └── example
│ └── log4j2.xml
給 Eclipse 用戶的提示:
右鍵單擊該項目,然后單擊“刷新”。 確保您可以在 eclipse 中看到 log4j2.xml 文件。 (這解決了我的問題。)
詳細一點:
你不應該將文件添加到構建路徑。(如果你這樣做,eclipse 會警告你這個)
此文件的名稱未出現在“.classpath”文件中。
我很確定您必須寫下要記錄其消息的類的全限定名稱 - 類似於com.application.log4jtest.YourClass
。 如果這不起作用,請嘗試擺弄日志級別。
另外 - 就像通知一樣 - 你也可以寫
Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
我有類似的問題。 我將文件放在 src 文件夾下,它工作正常。 我沒有在 log4j2.xml 文件中提到任何包名。
在 log4j 2 的文檔中: http : //logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
“如果找不到 JSON 文件,XML ConfigurationFactory 將嘗試在類路徑上找到 log4j2.xml。”
但它不適用於類路徑。 相反,如果我們將它保存在 src 文件夾中,那么它就可以工作。
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.xml</param-value>
</context-param>
這里提到了類似的問題: https : //issues.apache.org/jira/browse/LOG4J2-357
我遇到了問題,我嘗試了一些解決方案,但只有這對我有用:
轉到 web.xml,並添加以下參數:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.xml</param-value>
</context-param>
好的,我解決了這個問題。 我必須在 xml 中指定 package="myPackage"
我也遇到了同樣的問題。我將 log4j2.xml 文件保存在 System 環境變量中。
變量名稱:sys_logroot 變量值:D:\\user\\gouse
並且沒有為我創建日志。
使用系統變量-Dlog4j.configurationFile=path/to/log4j2.xml
看這里
這解決了我的問題
我有相同的'ERROR StatusLogger No log4j2 configuration file found。 使用默認配置:僅將錯誤記錄到控制台。 一遍又一遍地留言。 這讓我發瘋了。 log4j2.xml 文件正確放置在 src/main/resources 中,就像我之前在數千個項目中所做的那樣。
我的解決方案是從根 pom.xml 中刪除 <packaging>pom</packaging> 。 打包 pom 導致 src/main/resources 的內容不被復制到目標/類。
為任何具有相同根本原因的人帶來愉快的日志記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.