it-swarm.com.de

Wie kann man log4j so konfigurieren, dass Protokolldateien nur die letzten sieben Tage aufbewahrt werden?

Ich habe das folgende Protokollierungsproblem bei mehreren Java-Anwendungen, die log4j für die Protokollierung verwenden:

Ich möchte, dass Protokolldateien täglich gedreht werden, z

log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04

Aus Datenschutzgründen dürfen wir Protokolldateien nicht länger als sieben Tage in meinem Unternehmen aufbewahren. Die Generierung der nächsten nächsten Protokolldatei log.2010-09-11 sollte daher das Löschen von log.2010-09-04 auslösen. Kann ein solches Verhalten mit log4j konfiguriert werden? Wenn nicht, wissen Sie eine andere elegante Lösung für diese Art von Protokollierungsproblemen?

51
asmaier

Sie können Ihr Housekeeping in einem separaten Skript ausführen, das täglich ausgeführt werden kann. Etwas wie das:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
25
dogbane

Ich gehe davon aus, dass Sie RollingFileAppender verwenden? In diesem Fall hat es eine Eigenschaft mit dem Namen MaxBackupIndex, mit der Sie die Anzahl der Dateien begrenzen können. Zum Beispiel:

log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
51
dty

Laut folgendem Beitrag können Sie dies mit log4j nicht tun: Verwenden Sie MaxBackupIndex in DailyRollingFileAppender -log4j

Soweit ich weiß, sollte diese Funktionalität es in log4j 2.0 schaffen, aber dieser Aufwand wurde abgelehnt. Laut der Logback-Website ist Logback der vorgesehene Nachfolger von log4j. Sie sollten dies in Betracht ziehen.

Es gibt eine API namens SLF4J, die eine allgemeine API zur Protokollierung bietet. Die aktuelle Protokollierungsimplementierung wird zur Laufzeit geladen. Abhängig von der von Ihnen bereitgestellten Konfiguration kann Java.util.log oder log4j oder logback oder eine andere Bibliothek verwendet werden, die Protokollierungsfunktionen bietet. Von log4j direkt zur Verwendung von SLF4J ist noch einiges an Arbeit, aber sie bieten einige Tools zur Automatisierung dieses Prozesses. Wenn Sie den Code für die Verwendung von SLF4J konvertiert haben, sollten Sie die Protokollierungs-Backends umstellen, indem Sie einfach die Konfigurationsdatei ändern.

13
PhilDin

log2j unterstützt jetzt das Löschen alter Protokolle. Schauen Sie sich das DefaultRolloverStrategy-Tag und einen Ausschnitt unten an. Es erstellt am selben Tag bis zu 10 Archive, parst das Verzeichnis $ {baseDir}, das Sie unter "Properties" bei maximaler Tiefe von 2 definieren, wobei der Protokolldateiname mit "app - *. Log.gz" übereinstimmt und Protokolle älter als 7 löscht Tage, aber behalten Sie die letzten 5 Protokolle, wenn Ihre letzten 5 Protokolle älter als 7 Tage sind.

  <DefaultRolloverStrategy max="10">
    <Delete basePath="${baseDir}" maxDepth="2">
      <IfFileName glob="*/app-*.log.gz">
        <IfLastModified age="7d">
          <IfAny>
            <IfAccumulatedFileCount exceeds="5" />
          </IfAny>
        </IfLastModified>
      </IfFileName>
    </Delete>
  </DefaultRolloverStrategy>
5
skim

Es gibt auch einen DailyRollingFileAppender; http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/DailyRollingFileAppender.html

Edit: Nach dem Lesen dieser besorgniserregenden Aussage;

Es wurde beobachtet, dass DailyRollingFileAppender eine Synchronisation aufweist Probleme und Datenverlust. Der log4j-Zusatz enthält Alternativen welche für neue Bereitstellungen in Betracht gezogen werden sollten und welche besprochen werden in der Dokumentation zu org.Apache.log4j.rolling.RollingFileAppender.

von der oben genannten URL (die ich vorher noch nie realisiert hatte), sieht dies nach einer besseren Wette aus; http://logging.Apache.org/log4j/companions/extras/apidocs/index.html

4
Qwerky

Ich bin auf diesen Appender here gestoßen, der das tut, was Sie möchten. Er kann so konfiguriert werden, dass eine bestimmte Anzahl von Dateien beibehalten wird, die nach Datum verschoben wurden.

Download: http://www.simonsite.org.uk/download.htm

Beispiel (groovy):

new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
   file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
   maxRollFileCount: 7, compressionAlgorithm: 'GZ',
   compressionMinQueueSize: 2,
   layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))
3
Green Man

Es gibt eine weitere Option DailyRollingFileAppender . Es fehlt jedoch die automatische Löschfunktion (7 Tage protokollieren), nach der Sie suchen

probe

log4j.appender.DRF=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd

Ich stoße auf etwas call org.Apache.log4j.CompositeRollingAppender , das beide Funktionen des RollingFileAppender (maxSizeRollBackups, Anzahl der Sicherungsdateien) und DailyRollingFileAppender (roll by day) kombiniert ). 

Aber habe das nicht ausprobiert, es scheint nicht das Standard-Log4j-Feature von 1.2 zu sein.

3
user444904

Wenn Sie Linux verwenden, können Sie einen Cron-Job mit tmpwatch konfigurieren.

Die meisten Linux-Systeme haben einen tmpwatch-cron-Job, der das Verzeichnis/tmp bereinigt. Sie können ein weiteres hinzufügen, das Ihr Protokollierungsverzeichnis überwacht und Dateien löscht, die älter als 7 Tage sind.

Wenn Sie ein anderes System verwenden, gibt es wahrscheinlich gleichwertige Dienstprogramme.

1
emory

Verwenden Sie die Einstellung log4j.appender.FILE.RollingPolicy.FileNamePattern, z. log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz für die Aufbewahrung von Protokollen einen Monat vor dem Überschreiben.

Ich habe nicht einen Monat gewartet, um zu überprüfen, aber ich habe es mit mm (d. H. Minuten) versucht und das Überschreiben bestätigt. Ich gehe also davon aus, dass es für alle Muster funktionieren wird.

1
Ketan K Shah

Trotz des Startens eines Chrone-Jobs können wir für die Task die Datei log4j2.properties im Ordner config des logstash verwenden. Schauen Sie sich den Link unten an, das wird hilfreich sein.

https://github.com/elastic/logstash/issues/7482

0
Vaibhav Jain