Chiunque lavori con la piattaforma Java conosce sicuramente Log4J e sa di poter scrivere i propri log indifferentemente su console o su file (e non solo...).
Esiste un interessante appender aggiuntivo di Log4J che effettua un roll del file molto specifico; prima di proseguire diciamo subito che questo appender non viene fornito con la distribuzione standard, ma conl'ApacheExtras Companion scaricabile da:http://logging.apache.org/log4j/companions/extras/.
Una volta inseriti tutti i JAR nel classpath della propria applicazione, è possibile definire il nuovo appender all'interno del file di configurazione log4j.xml, come di seguito:
<appender name="rollinglogfile"
class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="ActiveFileName" value="logs/output.log"/>
<param name="FileNamePattern" value="logs/output.%d.log.gz"/>
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%p] %d{dd MMM HH:mm:ss.SSS} %t [%c] %m%n"/>
</layout>
</appender>
La cosa interessante di questo appender è contenuta all'interno della rollingPolicy
, ossia della politica con cui viene effettuato il rolling del file, e si identifica nei 2 parametri:
ActiveFileName
, rappresenta il nome del file corrente ossia il file su cui Log4J scrive in un determinato momento; FileNamePattern
, rappresenta il pattern da utilizzare per i file di log che devono essere archiviati.
L'utilizzo di entrambi i parametri favorisce il disaccoppiamento dei file di log, ma il vero punto di forza è rappresentato dal parametro FileNamePattern
.
Innanzitutto è possibile indicare all'appender di comprimere i file archiviati semplicemente inserendo il suffisso .gz
o .zip
nel pattern.
Infine, attraverso appositi placeholder, è possibile stabilire le tempistiche di archiviazione:
%d
, rappresenta un rolling giornaliero che scatta a mezzanotte e genera la stringa yyyy-MM-dd
;%d{yyyy-MM}
, rappresenta invece un rolling mensile e genera la stringa yyyy-MM
.
Nel caso specifico dell'esempio avremo che Log4J salva tutte le informazioni all'interno del file output.log
, ma allo scoccare della mezzanotte il file viene compresso in output.2011-05-16.log.gz
ed un nuovo file output.log
viene creato; e così via giorno dopo giorno.