2012-10-12 56 views
19

如果問題太重要,請原諒。我對log4j完全陌生。我看到有兩個標籤和標籤,指的是各種appender。 假設我想將我的代碼庫中的信息記錄在一個文件中,將它發送到我的電子郵件並打印到控制檯。我想要將關卡設置爲信息。是不是有足夠的一個標籤引用三個appender?(文件,電子郵件和控制檯)爲什麼我們需要另一個相同?爲什麼我們需要log4j.xml中的root和logger

+0

我的意思是不夠它有一個單一的根標籤?有三個參考appenders? – parameswar

回答

30

這就夠了。

在log4j中,記錄器與包或者有時與特定的類關聯。記錄器的包/類由屬性「name」定義。記錄器將消息記錄在它的包中,也記錄在所有子包和它們的類中。唯一的例外是記錄應用程序中所有類的消息的根記錄器。

一個記錄器也有等級,並且可能有一個或多個appender(記錄目的地)連接到它。

在下面的例子中,我們有兩個記錄器:

  • 根記錄器記錄與水平INFO或以上的所有包到各個目的地的消息:主機,電子郵件和文件,
  • 「com.foo」記錄器,用於將包含「com.foo」包及其子包的WARN級別或更高級別消息記錄到另一個文件。

    <log4j:configuration> 
        <!-- Declaration of appenders FILE, MAIL, CONSOLE and ANOTHERFILE --> 
        ... 
        <!-- --> 
    
        <logger name="com.foo"> 
         <level value="warn"/> 
         <appender-ref ref="ANOTHERFILE" /> 
        </logger> 
        <root> 
         <priority value ="info" /> 
         <appender-ref ref="FILE" /> 
         <appender-ref ref="MAIL" /> 
         <appender-ref ref="CONSOLE" /> 
        </root> 
    </log4j:configuration> 
    

你應該read more關於log4j的基礎知識。

+0

根記錄器是否也記錄「com.foo」類別的消息? –

+0

@ mmc18是的,定義。所有寫入appender ANOTHERFILE的消息也寫入根記錄器的appender。 –

+1

只需另外注意,您可以通過將記錄器的additivity屬性設置爲false來防止發送到ANOTHERFILE的消息發送到根記錄器。把它看作是一個例外,從低層到頂層(根層)冒泡。 addivity是沒有「拋出」的「catch」 – JReader