2012-12-02 39 views
3

我正在使用Tomcat 6並嘗試將JUL切換到Log4j2(2.0 beta 3)。但是,由於這是一個相當新的項目,文檔相當稀少,網上的資源也不多。Tomcat中的Log4j2

我想

  1. 上述調試級別的所有事件應該到磁盤上的文件是什麼。
  2. 錯誤應該去syserr
  3. 從信息到警告的一切應該去sysout
  4. Marked審計日誌應該跳過所有這些並轉到磁盤上的其他文件。

我試了一下

這是我第一次嘗試log4j2.xml文件:

我應該寫什麼在configuration status?關於它的一些文件在哪裏?

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="info"> 
<appenders> 
    <Console name="Console-err" target="SYSTEM_ERR"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <Console name="Console-out" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <File name="MyFile" fileName="app.log"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
</appenders> 
<loggers> 
    <logger name="com.ecm" level="error" additivity="false"> 
     <appender-ref ref="Console-err" /> 
     <appender-ref ref="MyFile" /> 
    </logger> 
    <root level="info"> 
     <appender-ref ref="Console-out" /> 
     <appender-ref ref="MyFile" /> 
    </root> 
</loggers> 
</configuration> 

如何記錄器名稱涉及到Java類和它們的記錄器?

示例代碼:

package com.ecm.backend; 

public final class Foo { 
    private static final Logger LOG = LogManager.getLogger(Foo.class); 

    public static void bar() { 
    LOG.error("this is error"); 
    LOG.warn("this is warning"); 
    } 
} 

當我運行它,我得到這個在控制檯和日誌文件:

10:22:49.385 [http-8080-3] ERROR com.ecm.backend.Foo - this is error 

爲什麼警告忽略?

如果我刪除了additivity="false",我得到:

10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error 
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error 

警告再次忽略重複錯誤(如預期)。

我在做什麼錯?


下折:Tomcat的休息可以用巨力,我只是想Log4j2我的應用程序。

回答

4

如果您設置配置狀態=「調試」,您將看到很多關於配置過程中發生的事情的log4j2內部日誌語句。這對解決配置問題可能很有用。

我通常設置配置狀態=「警告」,所以我只收到通知,如果有問題。

關於記錄程序的名稱,伐木工和他們的java類之間的關係,這也許可以幫助: http://logging.apache.org/log4j/2.x/manual/architecture.html

關於爲何警告被忽略的問題,有這樣的記錄器配置:

<logger name="com.ecm" level="error" additivity="false"> 

有也是這樣的記錄器:

Logger LOG = LogManager.getLogger(com.ecm.backend.Foo.class); 

記錄器配置「com.ecm」將處理所有來自LO G記錄器,但只有處於「錯誤」級別或更高(致命)的記錄纔會被記錄下來。其他級別的日誌事件(警告,信息,調試和跟蹤)會被過濾掉,因爲它們的級別太低。

加法性的工作方式是首先命名的記錄器配置(本例中爲「com.ecm」)決定事件是否應該過濾掉。然後,如果additivity =「true」(缺省值),則該事件將傳遞給父記錄器(在本例中爲根記錄器)。 因爲「警告」級事件已經被「com.ecm」記錄器配置過濾掉了,所以它永遠不會到達根記錄器。

不知道你想什麼來實現的,但如果你想在不同活動水平發送到不同的附加目的地,一個辦法做到這一點可能是對的appender-ref的設定水平,而不是在記錄器:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="info"> 
<appenders> 
    <Console name="Console-err" target="SYSTEM_ERR"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <Console name="Console-out" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <File name="MyFile" fileName="app.log"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
</appenders> 
<loggers> 
    <logger name="com.ecm" additivity="false"> 
     <appender-ref ref="Console-err" level="error" /> 
     <appender-ref ref="MyFile" level="debug" /> 
    </logger> 
    <root> 
     <appender-ref ref="Console-out" level="info" /> 
     <appender-ref ref="MyFile" level="debug" /> 
    </root> 
</loggers> 
</configuration> 

這會將LOG記錄器的輸出發送到MyFile,並且(如果級別錯誤或致命)也發送給Console-err。

不在「com.ecm」包中的記錄器的輸出也會發送到MyFile,並且(如果級別是信息,警告,錯誤或致命)也會發送給Console-out。

+0

謝謝!自12月以來,我設法配置它就好了,現在我是一個快樂的用戶;)(我應該回答我的問題在這裏的答案..) – vektor

+0

Vektor,我喜歡你的問題。我正在考慮在log4j2網站上添加一個FAQ頁面,其中包含像您這樣的問題。 –