2013-01-04 11 views
10

Mi piacerebbe avere una configurazione log4j.xml ed essere in grado di accedere alla console durante lo sviluppo della mia applicazione. Una volta distribuito in un ambiente, desidero solo accedere a un file appender e non alla console. Come posso raggiungere questo obiettivo?Log4j, disabilitare appendici dipendenti dall'ambiente

Questo è il mio config corrente:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Threshold" value="DEBUG" /> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${log-base-dir}/${adapter-name}.log" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="MaxBackupIndex" value="99" /> 
     <param name="append" value="true" />   
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="info" /> 
     <appender-ref ref="ConsoleAppender" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

</log4j:configuration> 
+0

È che si desidera utilizzare lo stesso file e ottenere quello? È possibile differenziare il registro se si eseguono casi di test e distribuzione.Penso che devi modificare manualmente il file. – VinayVeluri

risposta

11

Una delle soluzioni potrebbe essere la separazione dei file di configurazione log4j per sviluppo e produzione ambienti ad esempio:

  • log4j-development.xml - per l'ambiente di sviluppo
  • log4j-production.xml - per ambiente di produzione

Quindi il comando di avvio dell'applicazione potrebbe avere il parrameter che specifica il file di configurazione log4j ad es. java -Dlog4jconfig=log4j-development.xml -jar Application.jar

È possibile configurare log4j ottenendo il valore della proprietà log4jconfig nel codice ad es. System.getProperty("log4jconfig").

A favore di questa soluzione sono i seguenti:

  • È possibile specificare logger in modo indipendente (ConsoleAppender e LogFileAppender in fase di sviluppo e solo LogFileAppender in produzione)
  • È possibile specificare il livello di registrazione per l'ambiente (ad es error in produzione e debug in sviluppo)
  • È possibile configurare il registratore di file in modo indipendente, ad es. tenere registri per X giorni della produzione (a fini di controllo, ecc) e hanno solo un file di log in fase di sviluppo, ecc

Questo modello è utilizzato in molti application server in cui avete più ambienti (sviluppo, SVS, Messa in scena, Produzione ecc)

Esempio di log4j-development.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Threshold" value="DEBUG" /> 
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="debug" /> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 

</log4j:configuration> 

Esempio di log4j-production.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${log-base-dir}/${adapter-name}.log" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="MaxBackupIndex" value="99" /> 
     <param name="append" value="true" />   
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="error" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

</log4j:configuration> 
+4

Come variazione su questo, è sempre possibile fare riferimento a 'log4j.xml' nella configurazione ma avere il processo di compilazione (Maven/Ant), copiare' log4j-production.xml' in 'log4j.xml' quando si creano i JAR di produzione. – AngerClown

+0

Ero a conoscenza di questa soluzione, ma mi chiedevo se esistesse un altro modo intelligente per avere solo un file log4j.zml piuttosto che due per soddisfare i requisiti che avevo. – Ash

6

È facile utilizzare il parametro Threshold di Appender e la proprietà di sistema JVM. Per esempio.

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Threshold" value="${my.console.level}" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" /> 
    </layout> 
</appender> 

Poi quando si avvia l'applicazione su uso prod -Dmy.console.level=OFF

Allo stesso tempo, quando si inizia a livello locale usare -Dmy.console.level=ALL

Sia OFF e ALL sono i livelli di log4j validi.

+0

Funziona bene per me, evitare di aggiungere un altro file log4j per la produzione, grazie – EPerrin95

Problemi correlati