Come configurare log4j per conservare solo i file di registro per gli ultimi sette giorni?

Ho il seguente problema di registrazione con diverse applicazioni Java che utilizzano log4j per la registrazione:

Voglio che i file di registro vengano ruotati ogni giorno, come

 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 

Ma per ragioni di sicurezza dei dati non è consentito tenere file di registro per più di sette giorni presso la mia azienda. Pertanto, la generazione del prossimo file di registro log.2010-09-11 dovrebbe triggersre la cancellazione di log.2010-09-04 . È ansible configurare un simile comportamento con log4j ? In caso contrario, conosci un’altra soluzione elegante per questo tipo di problema di registrazione?

È ansible eseguire la gestione della casa in uno script separato che può essere cronned per funzionare quotidianamente. Qualcosa come questo:

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

Immagino tu stia usando RollingFileAppender? Nel qual caso, ha una proprietà chiamata MaxBackupIndex che puoi impostare per limitare il numero di file. Per esempio:

 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 

Secondo il post seguente, non è ansible farlo con log4j: Usa MaxBackupIndex in DailyRollingFileAppender -log4j

Per quanto ne so, questa funzionalità avrebbe dovuto trasformarsi in log4j 2.0, ma questo sforzo è stato deviato. Secondo il sito web di logback, il logback è il successore designato di log4j, quindi potresti prendere in considerazione l’idea di utilizzarlo.

Esiste un’API chiamata SLF4J che fornisce un’API comune per la registrazione. Caricherà l’effettiva implementazione della registrazione in fase di esecuzione, quindi, in base alla configurazione fornita, potrebbe utilizzare java.util.log o log4j o logback o qualsiasi altra libreria in grado di fornire servizi di registrazione. Ci sarà un po ‘di lavoro iniziale per passare dall’utilizzo di log4j direttamente all’utilizzo di SLF4J ma forniscono alcuni strumenti per automatizzare questo processo. Una volta convertito il codice per l’utilizzo di SLF4J, la commutazione dei backend di registrazione dovrebbe essere semplicemente un caso di modifica del file di configurazione.

log2j ora ha il supporto per cancellare i vecchi log. Dai un’occhiata al tag DefaultRolloverStrategy e a uno snippet di seguito. Crea fino a 10 archivi nello stesso giorno, analizzerà la directory $ {baseDir} che si definisce sotto il tag Proprietà alla profondità massima di 2 con nome file di registro corrispondente a “app – *. Log.gz” e cancella i registri più vecchi di 7 giorni ma conserva i 5 registri più recenti se i tuoi 5 registri più recenti sono più vecchi di 7 giorni.

             

C’è anche un DailyRollingFileAppender; http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html

Modifica: dopo aver letto questa dichiarazione preoccupante;

È stato osservato che DailyRollingFileAppender mostra problemi di sincronizzazione e perdita di dati. Il compagno extra di log4j include alternative che dovrebbero essere considerate per le nuove distribuzioni e che sono discusse nella documentazione per org.apache.log4j.rolling.RollingFileAppender.

dall’URL sopra (che non ho mai realizzato prima), allora sembra una scommessa migliore; http://logging.apache.org/log4j/companions/extras/apidocs/index.html

C’è un’altra opzione DailyRollingFileAppender . ma manca la funzione di eliminazione automatica (mantenere un registro di 7 giorni) che stai cercando

campione

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

Mi imbatto in qualcosa chiamata org.apache.log4j.CompositeRollingAppender , che combina entrambe le funzionalità di RollingFileAppender (maxSizeRollBackups, numero di file di backup) e DailyRollingFileAppender (roll by day).

Ma non l’ho provato, sembra non sia la caratteristica standard di log4j del ramo 1.2.

Mi sono imbattuto in questo appender che fa quello che vuoi, può essere configurato per mantenere un numero specifico di file che sono stati passati per data.

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

Esempio (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")) 

Se stai usando Linux, puoi configurare un cron job usando tmpwatch.

La maggior parte dei sistemi Linux ha un cron job tmpwatch che pulisce la directory / tmp. È ansible aggiungerne un altro che monitora la directory di registrazione ed elimina i file con una durata superiore ai 7 giorni.

Se si utilizza un sistema diverso, esistono probabilmente programmi di utilità equivalenti.

Utilizzare l’impostazione log4j.appender.FILE.RollingPolicy.FileNamePattern , ad esempio log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz per conservare i registri un mese prima del ribaltamento.

Non ho aspettato un mese per verificare, ma ho provato con mm (cioè minuti) e ho confermato che sovrascrive, quindi presumo che funzionerà per tutti i modelli.

Nonostante l’avvio di un lavoro di chrone, per l’attività, è ansible utilizzare il file log4j2.properties nella cartella config di logstash. Dai un’occhiata al link qui sotto, questo sarà utile.

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

La class DailyRollingFileAppender utilizza l’opzione DatePattern per specificare la pianificazione continua. Questo modello dovrebbe seguire le convenzioni SimpleDateFormat di Std. Ed. v1.4.2 . Quindi, dobbiamo usare l’opzione E (giorno in settimana). Per esempio:

  

Vedi di più sulla class DailyRollingFileAppender da log4j javadoc qui . Sfortunatamente la documentazione di Java 1.4.2 non è più online, ma puoi scaricarne una copia qui .

Avevo impostato:

 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.DatePattern='.'yyyy-MM-dd # Archive log files (Keep one year of daily files) log4j.appender.R.MaxBackupIndex=367 

Come altri prima di me, l’opzione DEBUG mi ha mostrato l’errore:

log4j: WARN Nessuna proprietà [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender.

Ecco un’idea che non ho ancora provato, supponiamo di aver impostato DatePattern in modo tale che i file si sovrascrivano l’un l’altro dopo il periodo di tempo richiesto. Per mantenere il valore di un anno ho potuto provare a impostare:

 log4j.appender.R.DatePattern='.'MM-dd 

Funzionerebbe o causerebbe un errore? Ad esempio, ci vorrà un anno per scoprirlo, potrei provare:

 log4j.appender.R.DatePattern='.'dd 

ma ci vorrà ancora un mese per scoprirlo.

Creo questo Methode e lo chiamo chiudendo l’applicazione:

  public void deleteFiles(){ File f = new File("log"); File[] fileArray = f.listFiles(); double timenow = System.currentTimeMillis(); double olderTenDays = timenow - 864000000;// MS for ten days for (int i = 0; i < fileArray.length; i++) { if(fileArray[i].lastModified()< olderTenDays ) fileArray[i].delete(); } }