2013-01-04 21 views
10

Chciałbym mieć jedną konfigurację log4j.xml i móc logować się do konsoli podczas tworzenia aplikacji. Po wdrożeniu w środowisku chcę logować się tylko do aplikacji dostarczającej pliki, a nie do konsoli. Jak mogę to osiągnąć?Log4j, wyłączenie aplikacji zależnych od środowiska

To jest mój aktualny config:

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

Czy chcesz użyć tego samego pliku i osiągnąć to? Możesz rozróżnić dziennik, jeśli wykonasz przypadki testowe i wdrożenie.Myślę, że musisz ręcznie zmienić plik. – VinayVeluri

Odpowiedz

11

Jednym z rozwiązań mogłoby być oddzielenie plików konfiguracyjnych Log4J dla rozwoju i produkcji środowiska np:

  • log4j-development.xml - dla rozwoju środowiska
  • log4j-production.xml - dla środowiska produkcyjnego

To polecenie uruchamiania aplikacji może mieć parametr określający plik konfiguracyjny log4j, np. java -Dlog4jconfig=log4j-development.xml -jar Application.jar

Możesz skonfigurować log4j, pobierając wartość log4jconfig w swoim kodzie, np. System.getProperty("log4jconfig").

Zalety tego rozwiązania są następujące:

  • Można określić rejestratory niezależnie (ConsoleAppender i LogFileAppender w rozwoju i tylko LogFileAppender w produkcji)
  • Można określić swój poziom rejestrowania za środowisko (np error w produkcja i w rozwoju)
  • Możesz skonfigurować rejestrator plików niezależnie np. przechowuj logi przez X dni w produkcji (do celów audytu itp.) i mają tylko jeden plik dziennika w rozwoju itd.

Ten wzór jest stosowany na wielu serwerach aplikacji, gdzie istnieje wiele środowisk (Rozwój, UAT, Ruszenie, produkcja itp)

Przykład 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> 

Przykład 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

Odmiennie, zawsze możesz odwołać się do 'log4j.xml' w konfiguracji, ale masz swój proces budowania (Maven/Ant), skopiuj' log4j-production.xml' do 'log4j.xml' podczas tworzenia produkowanych plików JAR. – AngerClown

+0

Byłem świadomy tego rozwiązania, ale zastanawiałem się, czy istnieje inny sprytny sposób, aby mieć tylko jeden plik log4j.zml, a następnie dwa, aby spełnić wymagania, które miałem. – Ash

6

Jest to łatwe do zrobienia za pomocą parametru systemowego appendera o wartości: Threshold i JVM. Na przykład.

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

Następnie podczas uruchamiania aplikacji na użyciu prod -Dmy.console.level=OFF

Jednocześnie podczas uruchamiania lokalnie używać -Dmy.console.level=ALL

Zarówno OFF i ALL są ważne poziomy log4j.

+0

Działa dobrze dla mnie, unikaj dodawania innego pliku log4j do produkcji, dziękuję – EPerrin95