簡體   English   中英

log4j 2 - 配置問題

[英]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”文件中。

  • 我把我的 log4j2.xml 放在 src/ 目錄下。 有用。

我很確定您必須寫下要記錄其消息的類的全限定名稱 - 類似於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM