2013-09-01 25 views
5

我學習SLF4J和Spring.I log4j的得到比根記錄等從SLF4J看到我們使用一個線如何使用Log4J的

private final Logger logger = LoggerFactory.getLogger(name.class); 

我已經看到,這是獲得根記錄由eyerywhere默認。

  1. 這是如何得到根記錄器?我錯了嗎?

  2. 如何獲得log4j.xml文件中定義的其他記錄器?

這是我的配置:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration PUBLIC 
    "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" 
    debug="false"> 

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" /> 
     </layout> 
    </appender> 

    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender"> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE" /> 
    </appender> 

    <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 

     <param name="File" value="C:/log/spring-hib.log" /> 
     <param name="MaxBackupIndex" value="100" /> 

     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" /> 
     </layout> 


    </appender> 

    <logger name="com.example.foo"> 
    <level value="DEBUG"/> 
    <appender-ref ref="FooLogFile"/> 
</logger> 



    <category name="org.hibernate"> 
     <priority value="DEBUG" /> 
    </category> 

    <category name="java.sql"> 
     <priority value="debug" /> 
    </category> 

    <root> 
     <priority value="INFO" /> 
     <appender-ref ref="ASYNC" /> 
    </root> 

</log4j:configuration> 

回答

19

我已經看到了,這是在默認情況下得到根記錄

不,它不是。

當你打電話private final Logger logger = LoggerFactory.getLogger(Name.class);和承擔Name FQN爲foo.bar.Name,那麼你正在使用的名稱foo.bar.Name一個記錄器,用於從foo.bar繼承,用於從foo繼承,用於從根繼承。

得到根記錄在SLF4J的方式是通過LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

你需要知道的是,記錄器是在層次結構。子級記錄器繼承父級配置(包括appender,level等)。我相信你已經混了的「讓這繼承配置從根記錄孩子記錄器」和「獲取ROOT記錄器」

我2.How可以得到它們在的log4j.xml文件中定義的其他記錄器的想法?

比如,你正在試圖讓com.example.foo,也就是對private final Logger logger = LoggerFactory.getLogger("com.example.foo");

如上所述,記錄器是分層的。如果你得到記錄器「com.example.foo.Bar」,假設你沒有給「com.example.foo.Bar」特定的設置,它的行爲應該和使用「com.example.foo」一樣除了日誌中顯示的記錄器名稱以外)。

由於通常的做法是將類名稱本身用作記錄器名稱,因此SLF4J還提供了一種通過提供類(如您在問題中所做的)獲取記錄器的方法,以便您可以執行Logger logger = LoggerFactory.getLogger(Bar.class); ,這使得它更易於重構。在這種情況下,獲得的記錄器名稱將與所提供的類(本例中爲「com.example.foo.Bar」)的FQN相同

+0

「,這使得它更易於重構,在這種情況下,記錄器名稱將與提供的類的FQN相同(本例中爲「com.example.foo.Bar」)「。我沒有得到最後一行.. – beinghuman

+0

我的意思是,如果Foo的Foo '是'com.example.foo.Bar',然後當你通過'... getLogger(Bar.class)'(哦,在我原來的答案錯字,將解決該問題)記錄器,返回的記錄器的名稱將是「com.example.foo.Bar」。對於「重構友好」語句:將FQN作爲字符串傳遞給Class對象以獲取記錄器的一個區別是,如果重命名類或包,則在後一種情況下仍然會得到正確的記錄器。 –

+0

這幫了我一大堆,非常感謝這個詳細的答案。 +1 – WillBD

1

1.How這個越來越根記錄

記錄器建立一個層次,你可以從這裏看到表:http://logging.apache.org/log4j/2.x/manual/architecture.html

2.如何使用c我得到其他記錄器是在log4j.xml文件中定義的?

如果您想嚴格定義那裏的內容,那麼您必須解析並讀取該配置文件。 如果您需要運行時的所有活動記錄器及其配置,則需要API。例如。文章如何做到這一點:http://nelz.net/2008/04/08/log4j-runtime-configuration/

而且,我還沒有發現任何slf4J.If好的教程,你有一些很好的聯繫

SLF4J有相當多的文檔:http://www.slf4j.org/docs.html但由於它只是一個包裝, log4j的不「工作」所以這裏有一本關於它:http://www.qos.ch/shop/products/log4jManual