2012-12-18 26 views
8

Używam RollingFileAppender z log4j 1.2.16, który wyrzuca pliki dziennika po osiągnięciu określonego rozmiaru. Teraz chcę codziennie wyrzucać pliki dzienników i po osiągnięciu określonego rozmiaru. W związku z tym będzie jeden lub więcej plików dziennika dziennie.Rolling logi według rozmiaru i czasu

Na przykład

myapp.log 
myapp-17.12.2013.log 
myapp-16.12.2012.log 
myapp-16.12.2012.1.log 
myapp-16.12.2012.2.log 

Czy istnieje appender off-the-shelf, który robi to już?

+0

http://stackoverflow.com/questions/3823977/need-a-working-example -of-configuring-log4j-rollingfileappender-via-properties – Stefan

Odpowiedz

8

Istnieją wprawdzie dwie opcje:

  1. użycie LogBack z jego wielkości i czasu wyzwalania polityki: http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedFNATP
  2. istnieje TimeAndSizeRollingAppender dla log4j stąd: http://www.simonsite.org.uk/

pamiętać, że zarówno opcje używają nazw plików. Rozważ to uważnie, jeśli istnieje inny skrypt automatycznie przenoszący te pliki. Zmiana nazwy pliku jest ryzykowna, gdy dwa procesy dotyczą tego samego pliku.

Moja sugestia to bezpośredni zapis do niezmiennej nazwy pliku logu we wzorze: myapp- {dd.MM.rrrr}. {X} .log. W ten sposób "rolling" to po prostu zamykanie jednego pliku i otwieranie nowego. Bez nazw. Brak wątków tła.

+0

To działa. Wielkie dzięki. –

3

Szybka odpowiedź to "nie". Patrząc na log4j's javadoc: https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html

Są tylko dwa gotowe programy pobierające pliki: DailyRollingFileAppender i RollingFileAppender (a pierwszy nie jest zalecany, ponieważ ma problemy z synchronizacją).

Aby osiągnąć to, co chcesz, powinieneś stworzyć swojego własnego programistę, rozszerzając RollingFileAppender i modyfikując go tak, aby przewinął plik, jeśli zmieni się dzień. Modyfikacja będzie w metodzie:

protected void subAppend(LoggingEvent event) 

Można zobaczyć swoje źródło tutaj: http://www.docjar.com/html/api/org/apache/log4j/RollingFileAppender.java.html (linia 274).

Wystarczy tylko skopiować i wkleić kod i zmienić opcję, jeśli wywołanie rollOver odpowiada Twoim potrzebom.

2

Poniżej xml konfiguracji będzie wykonać zadanie: JAR wymagane: log4j toczenia appender-20150607-2059

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration debug="true" 
    xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="file" 
     class="uk.org.simonsite.log4j.appender.TimeAndSizeRollingAppender"> 
     <param name="File" value="D:\\App.log" /> 
     <param name="Threshold" value="DEBUG" /> 
     <param name="DatePattern" value=".yyyy-MM-dd" /> 
     <param name="MaxFileSize" value="1KB" /> 
     <param name="MaxRollFileCount" value="100" /> 
     <param name="ScavengeInterval" value="30000" /> 
     <param name="BufferedIO" value="false" /> 
     <param name="CompressionAlgorithm" value="GZ" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="file" /> 
    </root> 

</log4j:configuration>