2013-09-01 15 views
5

Sto imparando SLF4J e log4j in Spring.I hanno visto che eyerywhere stiamo utilizzando una lineaCome arrivare diversa logger principale da SLF4J utilizzando Log4J

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

ho visto che si tratta di ottenere logger root predefinito.

  1. Come si ottiene il logger root? Mi sbaglio?

  2. Come posso ottenere altri logger definiti nel file log4j.xml?

Questa è la mia configurazione:

<?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> 

risposta

19

ho visto che questo sta diventando logger principale di default

No, non lo è.

Quando hai chiamato private final Logger logger = LoggerFactory.getLogger(Name.class); e si assume FQN di Name è foo.bar.Name, quindi si stanno ottenendo un registratore con il nome foo.bar.Name, per il quale eredita da foo.bar, per il quale eredita da foo, per il quale eredita dalla radice.

Il modo per ottenere il logger principale in SLF4J è di LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

Quello che dovete sapere è, logger sono in gerarchia. Il registratore di livello figlio eredita le configurazioni dal genitore (inclusi appendici, livello ecc.). Credo che aver mescolato l'idea di "ottenere un logger figlio che ha ereditato dalla radice config logger" e "ottenere il logger principale"

2.How posso ottenere altri software che vengono definite nel file di log4j.xml ?

Ad esempio, si sta cercando di ottenere com.example.foo, è semplicemente private final Logger logger = LoggerFactory.getLogger("com.example.foo");

Come accennato in precedenza, logger sono gerarchici. Se ottieni il logger "com.example.foo.Bar", dato che non hai specificato impostazioni specifiche per "com.example.foo.Bar", il suo comportamento dovrebbe essere lo stesso di "com.example.foo" (tranne il nome del logger mostrato nel log ovviamente).

Poiché è prassi normale utilizzare il nome della classe stessa come nome del registratore, SLF4J fornisce anche un metodo per ottenere il registratore fornendo una classe (come ciò che si fa nella domanda), in modo da poter eseguire Logger logger = LoggerFactory.getLogger(Bar.class); , che lo rendono più adatto al refactoring. In questo caso, il nome del logger ottenuto sarà lo stesso del FQN della classe fornita ("com.example.foo.Bar" in questo caso)

+0

"che lo rendono più adatto al refactoring. In questo caso, il il nome del logger ottenuto sarà lo stesso del FQN della classe fornita ("com.example.foo.Bar" in questo caso) ".Non ho ricevuto l'ultima riga .. – beinghuman

+0

Ciò che intendo è, se FQN di' Foo 'è' com.example.foo.Bar', quindi quando si ottiene logger da '... getLogger (Bar.class)' (Oh typo nella mia risposta originale, lo aggiusterò), il nome del logger restituito sarà "com.example.foo.Bar". Per la dichiarazione di "refactoring-friendly": una differenza di passaggio nell'FQN come oggetto stringa rispetto a Class per ottenere il logger è, se la classe o il pacchetto viene rinominato, si otterrà comunque il logger corretto in quest'ultimo caso. –

+0

Questo mi ha aiutato un sacco, grazie mille per questa risposta dettagliata. +1 – WillBD

1

1.How questo sta diventando radice logger

logger creare una gerarchia, come si può vedere dalle tabelle qui: http://logging.apache.org/log4j/2.x/manual/architecture.html

2.Come c ho altri logger che sono definiti nel file log4j.xml?

Se si desidera rigorosamente ciò che è definito lì, si deve analizzare e leggere il file di configurazione. Se sono necessari tutti i logger attivi e la loro configurazione in fase di runtime, c'è l'API per esso. Per esempio. un articolo come farlo: http://nelz.net/2008/04/08/log4j-runtime-configuration/

Inoltre, ho havent qualche buon tutorial su slf4J.If avete alcuni buoni collegamenti

slf4j ha parecchi documenti: http://www.slf4j.org/docs.html ma dal momento che è solo un involucro, log4j fa il "lavoro" ecco un libro su di esso: http://www.qos.ch/shop/products/log4jManual