Logrotate: configurare la rotazione automatica dei log: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
mNessun oggetto della modifica
 
(12 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
{{stub}}  
{{Versioni compatibili}}
[[Categoria:Da Adottare]]
== Introduzione ==
Logrotate è un'utility che facilita l'amministrazione di quei sistemi che generano un elevato numero di file di [[log]] consentendo la loro rotazione, compressione, rimozione e invio tramite email, ma si rende anche utile nella gestione dei file di log generati da [[script]] o servizi personalizzati.<br/>
La sua installazione è pertanto fortemente consigliata sul nostro sistema in quanto impedisce sia che i file di log raggiungano dimensioni ragguardevoli intasando la directory <code>/var/log</code> sia che diventino talmente corposi da non permetterne un'agevole consultazione.<br/>


== Introduzione ==
Se <code>logrotate</code> è già installato sulla nostra macchina, si possono vedere i risultati del suo funzionamento aprendo una [[shell]] ed eseguendo:
In questi giorni ho dovuto configurare la rotazione automatica dei log di un applicazione, altrimenti questi file rischiavano di diventare troppo grandi. Così mi sono deciso di scrivere questa guida-appunto per la configurazione del servizio.
<pre>$ ls -l /var/log</pre>
In effetti logrotate consente di fare in modo di "ruotare" i file di log, ma non solo, consente di cancellare, comprimere e inviare tramite mail i file di log troppo vecchi o che stanno assumendo delle dimensioni critiche per l'occupazione di spazio su disco.
in questo modo si può notare come i log di sistema vengano periodicamente ruotati e compressi in modo automatico secondo delle regole che vedremo tra breve.


== Installazione ==
== Installazione ==
Per installare logrotate è sufficiente un
Tipicamente <code>logrotate</code> è installato di default su ogni sistema Debian. In caso contrario:
<pre>
<pre>
# apt-get install logrotate
# apt-get install logrotate
</pre>
</pre>


Durante l'installazione verrà creato anche un [[cron]] che si occuperà, giornalmente, di richiamare logrotate per effettuare la rotazione dei file di log. Se l'installazione viene fatta su un portatile, consiglio anche l'installazione di [[Anacron]].
Durante l'installazione verranno creati, tra gli altri, tre file e una directory in base ai quali verrà determinato il comportamento di <code>logrotate</code>:
* <code>/etc/logrotate.conf</code>
* <code>/etc/logrotate.d/</code>
* <code>/etc/cron.daily/logrotate</code>
* <code>/var/lib/logrotate/status</code>
 
== Funzionamento ==
Il funzionamento, di per sé, è molto semplice: ogni giorno viene eseguito dal [[demone]] [[cron]] lo script <code>/etc/cron.daily/logrotate</code> che si occupa di effettuare le rotazioni in base al contenuto del file <code>/var/lib/logrotate/status</code> (timestamp) e alle impostazioni presenti nei file di configurazione <code>/etc/logrotate.conf</code> .<br/>
Questo file di configurazione contiene, tra le altre cose, una direttiva che indica a <code>logrotate</code> di leggere anche i file contenuti nella directory <code>/etc/logrotate.d/</code> e di considerarli come file di configurazione aggiuntivi.<br/>
Per facilitare la gestione, quindi, la configurazione di <code>logrotate</code> è suddivisa di default tra il file <code>logrotate.conf</code> e i file presenti in <code>logrotate.d</code> ; la cosa importante da tener sempre presente è che il tutto può essere visto come un unico grande file di configurazione che parte con le righe di <code>logrotate.conf</code>, prosegue con il contenuto dei file di <code>logrotate.d</code> (e di ogni altro file/directory specificato con l'opzione "include") e termina con le ultime righe di <code>logrotate.conf</code> .<br/>
Visualizzate mentalmente questo unico file immaginario quando si andranno a scrivere le opzioni locali o globali, questo consentirà di comprendere anche perché l'ordine con cui vengono scritte le linee di configurazione è particolarmente importante.
 
La rotazione prevede la cancellazione dell'ultimo file ruotato mentre il suo posto viene preso dal penultimo file e così via. Ad esempio, se all'inizio si ha il file di log "miolog" con tre rotazioni settimanali si avrà:
;<span style="color:#7e1b4e">prima settimana</span>:''miolog'' viene ruotato e rinominato in ''miolog.1''<br/>Viene creato un nuovo file ''miolog''<br/>'''Risultato:''' ''miolog, miolog.1''
;<span style="color:#7e1b4e">seconda settimana</span>:''miolog.1'' viene rinominato in ''miolog.2''<br/>''miolog'' viene rinominato in ''miolog.1''<br/>Viene creato un nuovo file ''miolog''<br/>'''Risultato:''' ''miolog, miolog.1, miolog.2''
;<span style="color:#7e1b4e">terza settimana</span>:''miolog.2'' viene rinominato in ''miolog.3''<br/>''miolog.1'' viene rinominato in ''miolog.2''<br/>''miolog'' viene rinominato in ''miolog.1''<br/>'''Risultato:''' ''miolog, miolog.1, miolog.2, miolog.3''
;<span style="color:#7e1b4e">rotazioni successive</span>:''miolog.3'' è rinominato in ''miolog.4'' e viene cancellato<br/>''miolog.2'' viene rinominato in ''miolog.3''<br/>''miolog.1'' viene rinominato in ''miolog.2''<br/>''miolog'' viene rinominato in ''miolog.1''<br/>'''Risultato:''' ''miolog, miolog.1, miolog.2, miolog.3''
 
Si può fare in modo da inviare l'ultimo log via email (prima di cancellarlo), in questo caso verrà inviato in formato non compresso. Oppure si può salvarlo o anche passarlo a dei comandi di scripting per manipolarlo prima della sua cancellazione.
 
Descriviamo ora brevemente i principali file di cui si serve <code>logrotate</code>.
 
=== <code>/etc/cron.daily/logrotate</code> ===
Questo script ha il seguente contenuto:
<pre>
#!/bin/sh
 
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
</pre>
e, come si può vedere, ha un compito banale: verificare l'esistenza di <code>logrotate</code> e, quindi, eseguirlo con le impostazioni contenute nel file <code>/etc/logrotate.conf</code> .<br/>
 
Vista la sua locazione, questo script viene eseguito dal demone cron ogni giorno. Il minuto e l'ora della sua esecuzione sono determinati dal file <code>/etc/crontab</code>, in particolare dalla riga:
<pre>
25 6 * * *  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
</pre>
In questo esempio si vede come gli script contenuti in <code>/etc/cron.daily</code> vengano eseguiti ogni giorno alle 6.25 .
 
Assicuratevi che la macchina sia accesa quando ''Cron'' lancia gli script giornalieri; in caso contrario questi script, e dunque anche <code>logrotate</code>, non verranno eseguiti portando all'effetto indesiderato di avere file di log di dimensioni abnormi.<br/>
Per evitare questo problema può essere necessario modificare il file <code>/etc/crontab</code> oppure installare [[Anacron]].
 
=== <code>/etc/logrotate.conf</code> ===
Questo è il principale file di configurazione. Il suo compito è informare <code>logrotate</code> su tutte le opzioni di configurazione da utilizzare per tutti i file di log specificati.<br/>
Le righe che iniziano con il carattere "#" sono viste come commenti.<br/>
{{Box|Nota|Utilizzare spesso e volentieri i commenti per descrivere ciò che si è modificato (e magari anche la data della modifica). Potranno sembrare un'inutile perdita di tempo ma ringrazierete di averli scritti quando andrete a leggere la configurazione a distanza di mesi.}}
 
La direttiva:
<pre>
include /etc/logrotate.d
</pre>
serve a specificare il percorso in cui si trovano gli altri file di configurazione aggiuntivi per <code>logrotate</code>. Il normale flusso del file viene interrotto, si leggono i file in <code>logrotate.d</code> e poi si riprende dalla riga successiva a "include". Ovviamente possono essere aggiunti tutti gli "include" che si desiderano.<br/>
{{Box|Nota|L'opzione "include' risulta particolarmente utile per specificare un file o una directory personalizzata. In questo modo è possibile inserire delle proprie configurazioni senza modificare più di troppo il file <code>logrotate.conf</code> o senza aggiungere file a <code>logrotate.d</code> .}}
 
Poiché questo file viene letto per primo, le opzioni contenute in <code>logrotate.conf</code> (ma che si trovano prima di "include") si applicano a tutti i file di log che hanno una sezione di configurazione nello stesso <code>logrotate.conf</code> oppure nei file contenuti in <code>/etc/logrotate.d</code> .<br/>
Ad esempio la direttiva:
<pre>rotate 4</pre>
si applicherà a tutti i file di log, a meno che non venga inserita successivamente una uguale opzione che specifichi diversamente.
 
=== <code>/etc/logrotate.d/</code> ===
In questa directory sono contenuti i file di configurazione per diversi log di sistema. Questi file vengono tipicamente installati da diversi [[pacchetto|pacchetti]] per gestire propri file di log.<br/>
I file contenuti in questa directory sono letti da <code>logrotate</code> in ordine alfabetico e, a meno che non abbiano una estensione particolare (vedere la direttiva <code>tabooext</code>), vengono visti tutti come file di configurazione.
 
Ad esempio:
;<code>/etc/logrotate.d/consolekit</code>:viene installato tramite il pacchetto ''consolekit'' e istruisce <code>logrotate</code> su come gestire il file di log <code>/var/log/Consolekit/history</code>
;<code>/etc/logrotate.d/dpkg</code>:viene installato tramite il pacchetto ''dpkg'' e istruisce <code>logrotate</code> su come gestire i file di log <code>/etc/log/dpkg.log</code> e <code>/var/log/alternatives.log</code>
;<code>/etc/logrotate.d/rsyslog</code>:viene installato tramite il pacchetto <code>rsyslog</code> e istruisce <code>logrotate</code> su come gestire importanti file di log tra cui <code>/var/log/kern.log</code>, <code>/var/log/syslog</code> e <code>/var/log/auth.log</code>
 
{{Warningbox|
Prestare particolare attenzione al fatto che i file presenti in <code>logrotate.d</code> sono in tutto e per tutto dei file di configurazione di <code>logrotate</code> e non solo relativi a un particolare file di log. Una opzione globale, contenuta cioè al di fuori delle parentesi graffe, si applica a tutti i file successivi.<br/>
A meno che non abbiate un motivo valido per farlo, tutti i file che si trovano in <code>/etc/logrotate.d/</code> non hanno e non dovrebbero avere direttive al di fuori delle parentesi graffe.}}
 
=== <code>/var/lib/logrotate/status</code> ===
Questo è il file in cui sono contenuti gli orari (timestamp) in cui è avvenuta l'ultima rotazione per un particolare file.
La forma di questo file è:
<pre>nome_file_di_log timestamp</pre>
quindi per ogni file viene specificato un timestamp che viene aggiornato dopo ogni rotazione.<br/>
<code>logrotate</code>, ad ogni sua esecuzione, consulta questo file per determinare se la rotazione deve avvenire o meno; inserisce anche nuove linee se sono state aggiunte configurazioni per altri file di log.
 
== Opzioni ==
Fino ad ora si è scritto di come le opzioni per <code>logrotate</code> siano contenute nel file <code>/etc/logrotate.conf</code> e nei file presenti in <code>/etc/logrotate.d/</code>. Adesso si cercherà di spiegare come funzionano le direttive e in cosa consistono.<br/>
Le direttive di <code>logrotate</code> possono essere di due tipi:
* Direttive globali: si applicano a tutti i file ruotati da <code>logrotate</code>. Andrebbero inserite esclusivamente nel file <code>/etc/logrotate.conf</code>
* Direttive locali: si applicano ad un file (o a un gruppo di file) ruotati da <code>logrotate</code>. Queste direttive sono comprese tra parentesi graffe e andrebbero inserite esclusivamente nei file della directory <code>/etc/logrotate.d/</code>
 
=== Opzioni globali ===
Sono direttive per <code>logrotate</code> che si applicano a tutti i file di log. Queste direttive vanno scritte nel file <code>/etc/logrotate.conf</code> e in nessun caso vanno inserite nei file in <code>/etc/logrotate.d/</code> (al di fuori delle parentesi graffe) a meno che non si sappia esattamente cosa si stia facendo.<br/>
Una direttiva globale sovrascrive un'uguale direttiva precedente e si applica a tutti i file di log che seguono. Inserire pertanto in <code>logrotate.conf</code> la direttiva:
<pre> compress </pre>
prima di:
<pre> include /etc/logrotate.d </pre>
significa imporre la compressione per tutti i file di log successivi. Inserirla dopo la direttiva di "include" ha l'effetto di imporre la compressione solo per i file <code>/var/log/wtmp</code> e <code>/var/log/btmp</code> .
 
=== Opzioni locali ===
Sono contenute tra parentesi graffe e si applicano solo al/ai file di log a cui si riferiscono. Le opzioni locali possono sovrascrivere le opzioni globali, anzi questo è ciò che accade normalmente.


Ad esempio il file <code>logrotate.conf</code> contiene:
<pre>
/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}
</pre>
in cui ci sono quattro direttive locali per il file <code>/var/log/btmp</code>; l'ultima di queste ("rotate 1") sovrascrive l'analoga direttiva globale contenuta nel file ("rotate 4")<br/>
Altro esempio è il file <code>/etc/logrotate.d/consolekit</code> che contiene:
<pre>rotate 6</pre>
anch'esso sovrascrive l'analoga direttiva contenuta in <code>/etc/logrotate.conf</code> .


== Funzionamento ==
Le direttive locali possono essere applicate anche a più di un file:
Il funzionamento, di per , è molto semplice: ad intervalli regolari viene lanciato il programma logrotate, che si occupa di effettuare le rotazioni dei file di log in base alle impostazioni presenti nei file di configurazione.
<pre>
/path/file1 /path/file2 {
...
...
}
</pre>
oppure:
<pre>
/path/file1
/path/file2 {
...
...
}
</pre>
o anche:
<pre>
"/path/file1"
/path/file2 {
...
...
}
</pre>
i doppi apici sono necessari nel caso in cui si abbia la necessità di inserire un nome di file che contenga ad esempio degli spazi.
 
=== Opzioni disponibili ===
Qui di seguito verranno elencate le opzioni più comuni per <code>logrotate</code>. Alcune di esse hanno una corrispettiva opzione che ne disabilita il comportamento (normalmente è un'opzione locale che disabilita/sovrascrive un'opzione globale). Alcune vanno inserite senza ulteriori aggiunte, altre devono essere seguite da un parametro, altre ancora hanno significato solo se sono state specificate in precedenza altre opzioni. <code>logrotate</code>, nel caso alcune opzioni non siano state definite, può non considerarle oppure considerarle attribuendogli un valore di default.
Fare riferimento alla pagina di manuale:
<pre>$ man logrotate</pre>
per una trattazione completa.
 
'''compress, nocompress'''<br/>
Indica a <code>logrotate</code> se procedere o meno con la compressione dei file ruotati. L'opzione di default è "nocompress", per cui si avranno: ''miolog, miolog.1, miolog.2'' e così via mentre, se "compress" è specificato, si otterrà ''miolog, miolog.1.gz, miolog.2.gz'' e così via.<br/>
Notare che in <code>logrotate.conf</code> l'opzione "compress' è commentata:
<pre>
#compress
</pre>
questo significa che tutti i log, a meno che non abbiano l'opzione locale "compress", non saranno compressi.<br/>
Il comando di compressione utilizzato è ''gzip''.


Il file di configurazione principale si trova in <code>/etc/logrotate.conf</code> che detta le impostazioni globali per il funzionamento del programma attraverso il solito schema ''"direttiva valore"'', nello stesso file possono essere inserite delle impostazioni specifiche per ogni file di log che si voglia gestire secondo lo schema sotto riportato:
'''compresscmd'''
Questa opzione può essere utilizzata per specificare un comando diverso da ''gzip'' con cui effettuare la compressione. Ad esempio:
<pre>
/var/log/miolog {
  weekly
  rotate 4
  compress
  compresscmd /usr/bin/lzma
  compressext .lzma
</pre>
per usare ''lzma'' al posto di ''gzip''.
     
'''uncompresscmd'''<br/>
Come "compresscmd" ma deve essere specificato l'eseguibile con cui decomprimere i file compressi (necessario per inviare i log via email).<br/>
Ad esempio, se il programma di compressione è ''lzma'', come programma di decompressione verrà utilizzato ''unlzma'':
<pre>
<pre>
PATH_DEL_FILE {
/var/log/miolog {
direttiva_1 valore_1
  compress
direttiva_2 valore_2
  compresscmd /usr/bin/lzma
.....
  uncompresscmd /usr/bin/unlzma
direttiva_n valore_n
  compressext .lzma
  mail root
}
}
</pre>
</pre>
Una direttiva importantissima, presente nella sezione delle impostazioni globali di logrotate.conf è <code>include</code>, questa direttiva può essere seguita da un file o da una directory (solitamente <code>/etc/logrotate.d/</code>), nel primo caso viene "incluso" il file di configurazione passato come valore, nel secondo tutti i file di configurazione presenti nella directory. I file indicati in tale direttiva rispecchiano lo schema di cui sopra.
Di default viene utilizzato ''gunzip''.


'''compressext'''<br/>
L'estensione del file compresso creato con la rotazione. Di default è ".gz". Se è stata utilizzata l'opzione "compresscmd", modificare l'estensione in base al comando scelto; ad esempio:
<pre>
/var/log/miolog {
  compress
  compresscmd /usr/bin/lzma
  compressext .lzma
}   
</pre>


Per capire meglio il funzionamento (e di cosa è capace questo software) prendiamo in considerazione alcuni file di configurazione, andando a vedere le direttive e a cosa servono:
'''compressoptions'''<br/>
Se si vuole eseguire il comando di compressione con delle opzioni, questo è il posto per specificarle. Di default viene utilizzato "gzip" e le sua opzione di default è "-9" (massima compressione).


'''copy, nocopy'''<br/>
Con "copy", come si può immaginare, viene effettuata una copia del file di log e la compressione avviene su quest'ultima. Il file di log di partenza viene lasciato inalterato. Questa opzione inibisce "create" che non avrà effetto.<br/>
Necessaria se il logging del programma non può essere temporaneamente sospeso durante la rotazione.<br/>
L'opzione di default è "nocopy".
     
'''copytruncate, nocopytruncate'''<br/>
Come "copy" ma il file di log di partenza viene troncato a zero byte. Notare che esiste sempre un intervallo di tempo che intercorre tra la copia e il troncamento, in questo intervallo si può avere la perdita di messaggi di logging.<br/>
L'opzione di default è "nocopytruncate".


Per capire meglio il funzionamento (e di cosa è capace questo software) prendiamo in considerazione alcuni file di configurazione:
'''create, nocreate'''<br/>
Viene creato un nuovo file di log subito dopo la rotazione. Quindi, se ''miolog'' viene ruotato in ''miolog.1.gz'', verrà creato un nuovo file ''miolog'' che, di default, avrà gli stessi attributi del precedente. Questo comportamento può essere modificato specificando esplicitamente i nuovi attributi e l'utente/gruppo proprietario del file:
<pre>
create 666 pippo:disney
</pre>
farà in modo che il file creato abbia i permessi di lettura e scrittura per tutti e appartenga all'utente "pippo" e al gruppo "disney".
     
'''daily, monthly, weekly, yearly'''<br/>
Quando ruotare il file di [[log]] (una volta al giorno, una a settimana, una al mese o una all'anno). <br/>
logrotate si avvia una volta al giorno al minuto/ora giornalieri specificati in <code>/etc/crontab</code> (sempre che non sia installato [[anacron]]), quindi confronta il timestamp con la data corrente e procedere alla rotazione in base all'opzione specificata.<br/>
Se il log da ruotare è più vecchio di un giorno rispetto al timestamp ed è specificato 'daily', il log viene ruotato.<br/>
Se il log da ruotare è più vecchio di una settimana rispetto al timestamp ed è specificato 'weekly', il log viene ruotato.<br/>
Se il log da ruotare è più vecchio di un mese rispetto al timestamp ed è specificato 'monthly', il log viene ruotato.<br/>
Se il log da ruotare è più vecchio di un anno rispetto al timestamp ed è specificato 'yearly', il log viene ruotato.


=== Apache ===
Ovviamente deve essere specificata solo una delle precedenti opzioni; se non viene specificato nulla, viene utilizzata "daily".
La particolarità di questo file di configurazione è la necessità di riavviare il servizio al termine della rotazione:
     
'''dateext, nodateext, dateformat, dateyesterday'''<br/>
Il file ruotato ha, di default, l'estensione contenente un numero (ad es. ''miofile.1'' o, se compresso, ''miofile.1.gz'').<br/>
Questa opzione permette di sostituire il numero con la data corrente nel formato YYYYMMDD. Ad esempio con:
<pre>
<pre>
/var/log/apache2/*.log {
/var/log/miolog {
        weekly
  ...
        missingok
  dateext
        rotate 52
  ...
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                if [ -f /var/run/apache2.pid ]; then
                        /etc/init.d/apache2 restart > /dev/null
                fi
        endscript
}
}
</pre>
</pre>
il log ruotato sarà ''miolog-20140811'' o, se compresso, ''miolog-20140811.gz'' .<br/>
"dateyesterday" permette di creare l'estensione con la data del giorno precedente alla rotazione, mentre con "dateformat" si può personalizzare il formato che la data dovrà utilizzare:
<pre>
/var/log/miolog {
  ...
  dateext
  dateformat -creato_il_%Y%m%d
  ...
}
</pre>
e il log ruotati saranno del tipo ''miolog-creato_il_20140811.gz'' .<br/>
"nodateext" permette di disabilitare l'opzione "dateext" se definita in precedenza come opzione globale.
     
'''delaycompress, nodelaycompress'''<br/>
Se è specificato "compress", il primo log ruotato subirà un ritardo ("delay") nella compresssione che partirà dalla seconda rotazione in poi. Il risultato è quello di avere ''miolog, miolog.1, miolog.2.gz, miolog.3.gz'' e così via.<br/>
Di default, se è specificato "compress", viene utilizzato "nodelaycompress" per cui non c'è nessun ritardo e i log saranno del tipo: ''miolog, miolog.1.gz, miolog.2.gz'' .
   
'''ifempty, notifempty'''<br/>
La rotazione viene effettuata anche se il file di log è vuoto ("ifempty") oppure solo se il file di log non è vuoto ("notifempty").<br/>
L'opzione di default è "ifempty".
     
'''include file_or_directory'''<br/>
Con l'opzione "include" si può specificare un file o una directory da cui leggere ulteriori configurazioni di <code>logrotate</code>.<br/>
L'utilità di "include" risulta evidente se abbiamo un file di configurazione personalizzato o una directory contenente configurazioni personalizzate per i nostri file di log, in questo modo eviteremo di "sporcare" il file <code>logrotate.conf</code> o la directory <code>logrotate.d</code>; basterà aggiungere a <code>logrotate.conf</code> ad esempio:
<pre>
...
include /percorso/del/file/mylogrotate
...
</pre>
notare che bisognerà inserire il [[path]] completo del file.
     
Lo stesso discorso vale anche per una directory:
<pre>
...
include /path/della/directory/mylogdir/
...
</pre>
in questo modo verranno letti tutti i file di configurazione presenti nella directory specificata.
'''mail, nomail, mailfirst, maillast'''<br/>
Queste opzioni possono essere utilizzate per inviare via email i log ruotati. I log, se compressi, verranno decompressi prima di essere inviati (vedere l'opzione "uncompresscmd"). <br/>
"mail" deve essere seguita da un indirizzo di posta valido e serve per inviare via email il log che sta per essere cancellato (se vi sono quattro rotazioni, sarà inviato il log ''miolog.5'' o ''miolog.5.gz'') o il log appena ruotato (''miolog.1'' o ''miolog.1.gz'').<br/>
Tutti i file riprendono poi il loro normale comportamento (''miolog.5.gz'' verrà cancellato, i file ruotati e ''miolog.1.gz'' resterà nella directory).<br/>
Facciamo qualche esempio:
<pre>
/var/log/miolog {
  ...
  mail root
  ...
}
</pre>
verrà inviato a [[root]] il log che sta per essere cancellato dopo la rotazione. Questa sintassi è equivalente a:
<pre>
/var/log/miolog {
  ...
  mail root
  maillast
  ...
}
</pre>
Mentre con:
<pre>
/var/log/miolog {
  ...
  mail root
  mailfirst
  ...
}
</pre>
Verrà inviato a root il file appena ruotato.
 
'''size, maxsize, minsize'''<br/>
Permettono di ruotare i file in base alla loro grandezza.<br/>
Queste opzioni devono essere seguite da una numero che indica i kilobyte (k), i megabyte (M) o i gigabyte (G); se non viene specificato nulla, si assumerà una grandezza espressa in byte.<br/>
Ad esempio:
<pre>
/var/log/miolog {
  ...
  size 500
  ...
}
</pre>
oppure:
<pre>
/var/log/miolog {
  ...
  size 500k
  ...
}
</pre>
oppure:
<pre>
/var/log/miolog {
  ...
  size 1M
  ...
}
</pre>
oppure:
<pre>
/var/log/miolog {
  ...
  size 2G
  ...
}
</pre>
Ci si potrebbe chiedere: se si ha la seguente configurazione:
<pre>
/var/log/miolog {
  ...
  monthly
  size 1M
  ...
}
</pre>
quando verrà ruotato "miolog"?<br/>
Possibili risposte:<br/>
'''A)''' Ogni mese ma solo se il file raggiunge 1M<br/>
'''B)''' Ogni mese ma anche quando il file raggiunge 1M<br/>
'''C)''' Ogni volta che il file raggiunge 1M, ma solo se è passato un mese
     
La risposta è '''B''': ogni mese ma anche quando il file supera 1M.<br/>
Questo vuol dire che il confronto sulla data e sulla dimensione sono in "OR" logico; basta che una delle due condizioni sia verificata perché avvenga la rotazione e sia aggiornato il file <code>var/lib/logrotate/status</code> .
     
Da questo comportamento dovrebbero risutare chiare due cose:<br/>
1) se ci si aspetta una rotazione alla fine del mese (diciamo il 25 agosto) ma la dimensione del log raggiunge 1M il 20 agosto, il log viene ruotato prima e il successivo confronto con la data verrà fatto il 20 settembre (e così via, teoricamente si può avere una rotazione del log senza che venga mai fatto un confronto tra date).<br/>
2) non si può fare affidamento sul periodo di rotazione impostato per il log; lo svantaggio è quello, ad esempio, di trovarsi con dodici rotazioni distanziate di un giorno anche se la configurazione era di dodici rotazioni distanziate di un mese.
     
"minsize" e "maxsize" sono molto simili a "size" se non per il fatto che il confronto tra date viene comunque eseguito.<br/>
Facciamo l'esempio di "maxsize":
<pre>
/var/log/miolog {
  ...
  monthly
  maxsize 1M
  ...
}
</pre>
Se il log raggiunge 1M, avviene la rotazione ma non viene modificato il timestamp, per cui la rotazione prevista dopo il periodo indicato (nell'esempio è un mese) viene comunque eseguita.<br/>
Il risultato è quello di avere dei log ruotati con una dimensione massima di 1M e distanziati al più di un mese (ma potrebbero essere distanziati di un intervallo temporale minore).


=== Aptitude ===
Con "minsize" avviene qualcosa di analogo:
<pre>
<pre>
/var/log/aptitude {
/var/log/miolog {
   rotate 6
   ...
  monthly
  minsize 500k
  ...
}
</pre>
Dopo un mese viene controllata la dimensione, se questa non supera i 500k allora la rotazione non avviene, il timestamp non viene aggiornato e si rinvia tutto alla successiva esecuzione di <code>logrotate</code>.<br/>
Il risultato è quello di avere dei log ruotati con una dimensione minima di 500k e distanziati di almeno un mese (ma potrebbero essere distanziati di un intervallo temporale maggiore).
 
Si scelga, pertanto, con particolare cura il valore di queste opzioni per non incappare in comportamenti imprevisti.
     
'''missingok, nomissingok'''<br/>
Se il file di log non esiste, <code>logrotate</code> terminerà con un messaggio d'errore. Se è specificato "missingok", <code>logrotate</code> non segnalerà nulla.<br/>
Di default è utilizzata "nomissingok".
   
'''olddir, noolddir(d)'''<br/>
La directory in cui vengono salvati i file ruotati (siano essi compressi o meno). Se viene specificata una directory solo con il proprio nome, questa si deve trovare nella stessa directory in cui si trova il file di log. Può essere specificato un percorso assoluto per bypassare questo comportamento.<br/>
Esempio:
<pre>
"/var/log/miolog" {
  ...
  olddir vecchi
  ...
}
</pre>
i log ruotati verranno salvati nella directory <code>/var/log/vecchi/</code> .<br/>
Con:
<pre>
"/var/log/miolog" {
  ...
  olddir /local
  ...
}
</pre>
i log ruotati verranno salvati in <code>/local</code> .
     
Le directory specificate devono esistere prima di poter essere utilizzate e devono trovarsi sullo stesso dispositivo fisico su cui si trova il file di log.<br/>
"noolddir" è il comportamento di default.<br/>
Un risultato tipico dell'opzione "olddir", se inserita in "logrotate.conf", è quello di trovarsi tutti i log ruotati in una sola directory ma diversa da <code>/var/log</code> .
   
'''postrotate/endscript'''<br/>
Possono essere eseguiti dei comandi subito dopo la rotazione del file, questi devono essere compatibili con <code>/bin/sh</code> (di default è un link a [[dash]]) e vanno inseriti tra le parole "postrotate" e "endscript".
<pre>
/var/log/miolog {
   monthly
   monthly
   compress
   compress
  postrotate
    chgrp utente $1
  endscript
}
</pre>
Il primo parametro ($1) è il nome del log appena ruotato (effettuare prima una prova, non fateci troppo affidamento) e il precedente esempio cambia il gruppo proprietario del file. <br/>
Ad esempio, se si vuol fare in modo che il file <code>syslog.1</code> abbia permessi <code>root:utente</code>, modificare il file <code>/etc/logrotate.d/rsyslog</code> in questo modo:
<pre>
/var/log/syslog {
  rotate 7
  daily
   missingok
   missingok
   notifempty
   notifempty
  delaycompress
  compress
  postrotate
    service rsyslog rotate > /dev/null
    chgrp utente $1
  endscript
}
</pre>
ora "utente" ha i permessi di lettura per <code>syslog.1</code> e per tutti i file creati con le successive rotazioni.
{{Warningbox|Quello appena fatto è solo un esempio. Se si vuole avere i permessi di lettura per i file di log, aggiungere il proprio utente al gruppo "adm".<br/>
Inoltre l'esempio precedente funziona solo su file non compressi; per operare sul file compresso, bisogna utilizzare "lastaction"}}
È importante sottolineare che in caso di una configurazione comune a più file:
<pre>
/var/log/miolog1
/var/log/miolog2
/var/log/miolog3
/var/log/miolog4 {
  ...
  postrotate
    ...
  endscript
  ...
}
}
</pre>
</pre>
tutto ciò che è incluso tra "postrotate/endscript" verrà eseguito per ogni file di log che verrà ruotato. Questo comportamento può essere cambiato con l'opzione "sharedscripts" in modo da eseguire "postrotate/endscript" una sola volta.
'''prerotate/endscript'''<br/>
Come "postrotate" eccetto per il fatto che le operazioni tra le parole "prerotate" e "endscript" vengono eseguite prima della rotazione
'''firstaction/endscript'''<br/>
'''lastaction/endscript'''<br/>
Esattamente come "prerotate/endscript" e "postrotate/endscript" ma i comandi vengono eseguiti prima di "prerotate" oppure dopo "postrotate". "lastaction" deve essere utilizzato per operare sul file compresso.<br/>
La sequenza sarà quindi: firstaction -> prerotate -> rotazione -> postrotate -> lastaction .
'''rotate count'''<br/>
Il numero di rotazioni dopo cui, di default, il log più vecchio viene eliminato (o salvato o inviato per email, dipende dalla configurazione scelta).<br/>
Ad esempio:
<pre>
/var/log/miolog {
  ...
  rotate 3
  ...
}
</pre>
dopo tre rotazioni si avrà: ''miolog, miolog.1.gz, miolog.2.gz'' e ''miolog.3.gz'' .<br/>
Alla successiva rotazione ''miolog.3.gz'' verrà cancellato e il suo posto verrà preso da ''miolog.2.gz'' che verrà rinominato in ''miolog.3.gz'' procedendo a cascata per i file ''miolog.1.gz'' e ''miolog'' .<br/>
Di default il valore per "rotate" è 0, ossia il log ruotato viene immediatamente cancellato.
'''shred, noshred, shredcycles numero'''<br/>
Dopo il numero di rotazioni definito (es. quattro rotazioni), il comportamento di default è quello di cancellare il log più vecchio (es. ''miofile.4.gz'').<br/>
Con questa opzione si utilizza ''shred'' per una cancellazione sicura del file.
Ad esempio si può inserire in <code>logrotate.conf</code> le seguenti righe:
<pre>
...
shred
shredcycles 4
...
</pre>
per utilizzare la cancellazione sicura per tutti i file di log che stanno per essere eliminati (a meno che non sia stato specificato ''noshred'' per un particolare file).<br/>
"shredcycles" è seguito da un numero che indica quante sovrascritture verranno utilizzate da ''shred'', se non si specifica questa opzione, ''shred'' utilizzerà il numero di sovrascitture predefinito (tre). Vedere anche "man shred".<br/>
Questa opzione stabilisce solo le modalità di cancellazione, l'invio tramite email (se impostato) sarà ancor valido.<br/>
L'opzione di default è "noshred".


=== munin-node ===
'''start count'''<br/>
<pre>/var/log/munin/munin-node.log {
Il numero da cui si parte per contrassegnare i file ruotati. Di default è uno.<br/>
        daily
Con:
        missingok
<pre>
        rotate 7
/var/log/miolog {
        compress
  weekly
        copytruncate
  rotate 4
        notifempty
  compress
        create 640 root adm
  start 3
}</pre>
}
</pre>
Si avranno: ''miolog, miolog.3.gz, miolog.4.gz, miolog.5.gz, miolog.6.gz'' .
 
'''su user group'''<br/>
Il gruppo e l'utente con cui viene eseguito <code>logrotate</code>. Attenzione: l'uso di questa opzione '''non porta''' alla creazione dei file ruotati con le credenziali qui definite.<br/>
Di default <code>logrotate</code> viene eseguito con le credenziali "root:root" .


== Definizione di una rotazione personalizzata ==
'''tabooext [+] list'''<br/>
Di default tutti i file contenuti nella directory <code>/etc/logrotate.d/</code> o nelle directory specificate con l'opzione "include" vengono visti come file di configurazione. Tutti eccetto quelli con estensioni predefinite (vedere la [[manpage]] di <code>logrotate</code>) e quelli specificati con questa opzione.<br/>
Il carattere "+" aggiunge un'estensione alla lista predefinita'. Senza "+" le estensioni sostituiranno la lista predefinita.<br/>
Quindi con:
<pre>
/var/log/miolog {
  weekly
  rotate 4
  compress
  tabooext + .readme
}
</pre>
verrà aggiunta l'estensione ".readme" alla lista predefinita. In questo modo è possibile creare un file (ad es. ''LEGGIMI.readme'') in <code>logrotate.d</code> in cui scrivere annotazioni sulle operazioni personalizzate (file creati, quali opzioni sono state modificate, dove, per quale file) che si sono scelte per <code>logrotate</code>; in questo modo il file ''LEGGIMI.readme'' non verrà considerato come un file di configurazione.<br/>
Se si vogliono più estensioni, separarle con una virgola:
<pre>
tabooext + .readme, .leggimi, .info, .txt
</pre>
 
== Personalizzare <code>logrotate.d</code> ==
     
Per "personalizzazione" di logrotate si intendono due aspetti:
* Modificare la configurazione di <code>logrotate.d</code> nella gestione dei log di sistema
* Modificare la configurazione di <code>logrotate.d</code> nella gestione dei log di applicazioni personalizzate
     
=== Log di sistema ===
Tipicamente le configurazioni di default in "logrotate.conf" e "logrotate.d/" vanno più che bene.<br/>
Se si decide di modificarle, tener presente che gli aggiornamenti di <code>logrotate.d</code> o dei programmi che creano file in <code>logrotate.d</code> potrebbero tentare una sovrascrittura nel caso abbiano apportato dei cambiamenti nei file di configurazione di default.<br/>
La soluzione più semplice è utilizzare l'opzione "include" e un file di configurazione personalizzato oppure, se i cambiamenti sono pochi, modificare <code>logrotate.conf</code> ed effettuare un backup del file modificato.
     
Modificate con attenzione il file <code>logrotate.conf</code> e, se possibile, non toccate i file che si trovano nella directory "logrotate.d/" a meno che non conosciate con precisione le conseguenze che avranno i vostri cambiamenti.
     
=== Log personali ===
Se avete l'esigenza di ruotare dei file di log personali (magari creati da una vostra applicazione o da un vostro script) consiglio di non toccare il file <code>logrotate.conf</code> né di aggiungere altri file alla directory <code>logrotate.d</code> ; piuttosto eseguite <code>logrotate</code> all'interno di [[cron]] in modo che legga un vostro file o una vostra directory contenente tutte le vostre configurazioni personali.<br/>
Ad esempio:
<pre>
00 12 * * * logrotate -s /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf
</pre>
In questo modo verrà eseguito logrotate alle 12,00 di ogni giorno e considererà solo ciò che è contenuto in <code>/usr/local/etc/miologrotate.conf</code> utilizzando il file <code>/usr/local/etc/miologrotate.status</code> per i timestamp.<br/>
Il beneficio è quello di non intaccare minimamente il funzionamento di <code>logrotate</code> per i file di sistema.
     
Un esempio chiarisce il concetto.<br/>
Supponiamo di avere uno [[script]] che scrive i suoi log nel file <code>/home/pluto/mylogs/mylog.log</code> e che si abbia la necessità di doverlo ruotare affinché non cresca troppo; si vuole anche che i log più vecchi non vengano cancellati ma salvati nella directory <code>/home/pluto/backuplogs/</code> .<br/>
A tal scopo creiamo innanzitutto, con i permessi di root, due file:
* <code>/usr/local/etc/miologrotate.status</code>
* <code>/usr/local/etc/miologrotate.conf</code>
inizialmente vuoti:
<pre>
# touch /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf
</pre>
Poi modifichiamo <code>miologrotate.conf</code> così:
<pre>
/home/pluto/mylogs/mylog.log {
  daily
  rotate 1
  copytruncate
  notifempty
  missingok
  dateext
  compress
  delaycompress
  compresscmd /usr/bin/lzma
  uncompresscmd /usr/bin/unlzma
  compressext .lzma
  mail pluto
  lastaction
    cp /home/pluto/mylogs/mylog.log*.lzma /home/pluto/backuplogs/
  endscript
}
</pre>
e aggiungiamo un job di [[cron]] per root:
<pre>
0 0 * * * /usr/sbin/logrotate -s /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf
</pre>
Ora, a mezzanotte di ogni giorno, viene eseguito <code>logrotate</code>. Se è passato un giorno dall'ultima rotazione, il log viene ruotato, compresso con ''lzma'', inviato via email all'utente "pluto" e copiato nella directory <code>/home/pluto/backuplogs/</code> con il nome comprensivo della data.<br/>
Vi è un'unica rotazione ("rotate 1") per cui esisterà solo un file .lzma nella directory, questo file viene comunque subito spostato in <code>/home/pluto/backuplogs/</code> (direttiva ''lastaction'').
Tutti i permessi dei file compressi rimangono gli stessi del file iniziale <code>mylog.log</code> .
     
     
{{Autori
|Autore = [[Utente:S3v|S3v]] 11:57, 13 ago 2014 (CEST)<br/>(guida originariamente scritta da [[Utente:MaXeR|MaXeR]])
|Estesa_da =
}}


== Elenco Opzioni ==
[[Categoria:Shell]] [[Categoria:Monitoraggio]] [[Categoria: Servizi di sistema]]

Versione attuale delle 08:36, 18 giu 2016

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

Logrotate è un'utility che facilita l'amministrazione di quei sistemi che generano un elevato numero di file di log consentendo la loro rotazione, compressione, rimozione e invio tramite email, ma si rende anche utile nella gestione dei file di log generati da script o servizi personalizzati.
La sua installazione è pertanto fortemente consigliata sul nostro sistema in quanto impedisce sia che i file di log raggiungano dimensioni ragguardevoli intasando la directory /var/log sia che diventino talmente corposi da non permetterne un'agevole consultazione.

Se logrotate è già installato sulla nostra macchina, si possono vedere i risultati del suo funzionamento aprendo una shell ed eseguendo:

$ ls -l /var/log

in questo modo si può notare come i log di sistema vengano periodicamente ruotati e compressi in modo automatico secondo delle regole che vedremo tra breve.

Installazione

Tipicamente logrotate è installato di default su ogni sistema Debian. In caso contrario:

# apt-get install logrotate

Durante l'installazione verranno creati, tra gli altri, tre file e una directory in base ai quali verrà determinato il comportamento di logrotate:

  • /etc/logrotate.conf
  • /etc/logrotate.d/
  • /etc/cron.daily/logrotate
  • /var/lib/logrotate/status

Funzionamento

Il funzionamento, di per sé, è molto semplice: ogni giorno viene eseguito dal demone cron lo script /etc/cron.daily/logrotate che si occupa di effettuare le rotazioni in base al contenuto del file /var/lib/logrotate/status (timestamp) e alle impostazioni presenti nei file di configurazione /etc/logrotate.conf .
Questo file di configurazione contiene, tra le altre cose, una direttiva che indica a logrotate di leggere anche i file contenuti nella directory /etc/logrotate.d/ e di considerarli come file di configurazione aggiuntivi.
Per facilitare la gestione, quindi, la configurazione di logrotate è suddivisa di default tra il file logrotate.conf e i file presenti in logrotate.d ; la cosa importante da tener sempre presente è che il tutto può essere visto come un unico grande file di configurazione che parte con le righe di logrotate.conf, prosegue con il contenuto dei file di logrotate.d (e di ogni altro file/directory specificato con l'opzione "include") e termina con le ultime righe di logrotate.conf .
Visualizzate mentalmente questo unico file immaginario quando si andranno a scrivere le opzioni locali o globali, questo consentirà di comprendere anche perché l'ordine con cui vengono scritte le linee di configurazione è particolarmente importante.

La rotazione prevede la cancellazione dell'ultimo file ruotato mentre il suo posto viene preso dal penultimo file e così via. Ad esempio, se all'inizio si ha il file di log "miolog" con tre rotazioni settimanali si avrà:

prima settimana
miolog viene ruotato e rinominato in miolog.1
Viene creato un nuovo file miolog
Risultato: miolog, miolog.1
seconda settimana
miolog.1 viene rinominato in miolog.2
miolog viene rinominato in miolog.1
Viene creato un nuovo file miolog
Risultato: miolog, miolog.1, miolog.2
terza settimana
miolog.2 viene rinominato in miolog.3
miolog.1 viene rinominato in miolog.2
miolog viene rinominato in miolog.1
Risultato: miolog, miolog.1, miolog.2, miolog.3
rotazioni successive
miolog.3 è rinominato in miolog.4 e viene cancellato
miolog.2 viene rinominato in miolog.3
miolog.1 viene rinominato in miolog.2
miolog viene rinominato in miolog.1
Risultato: miolog, miolog.1, miolog.2, miolog.3

Si può fare in modo da inviare l'ultimo log via email (prima di cancellarlo), in questo caso verrà inviato in formato non compresso. Oppure si può salvarlo o anche passarlo a dei comandi di scripting per manipolarlo prima della sua cancellazione.

Descriviamo ora brevemente i principali file di cui si serve logrotate.

/etc/cron.daily/logrotate

Questo script ha il seguente contenuto:

#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

e, come si può vedere, ha un compito banale: verificare l'esistenza di logrotate e, quindi, eseguirlo con le impostazioni contenute nel file /etc/logrotate.conf .

Vista la sua locazione, questo script viene eseguito dal demone cron ogni giorno. Il minuto e l'ora della sua esecuzione sono determinati dal file /etc/crontab, in particolare dalla riga:

25 6 * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

In questo esempio si vede come gli script contenuti in /etc/cron.daily vengano eseguiti ogni giorno alle 6.25 .

Assicuratevi che la macchina sia accesa quando Cron lancia gli script giornalieri; in caso contrario questi script, e dunque anche logrotate, non verranno eseguiti portando all'effetto indesiderato di avere file di log di dimensioni abnormi.
Per evitare questo problema può essere necessario modificare il file /etc/crontab oppure installare Anacron.

/etc/logrotate.conf

Questo è il principale file di configurazione. Il suo compito è informare logrotate su tutte le opzioni di configurazione da utilizzare per tutti i file di log specificati.
Le righe che iniziano con il carattere "#" sono viste come commenti.

Info.png Nota
Utilizzare spesso e volentieri i commenti per descrivere ciò che si è modificato (e magari anche la data della modifica). Potranno sembrare un'inutile perdita di tempo ma ringrazierete di averli scritti quando andrete a leggere la configurazione a distanza di mesi.


La direttiva:

include /etc/logrotate.d

serve a specificare il percorso in cui si trovano gli altri file di configurazione aggiuntivi per logrotate. Il normale flusso del file viene interrotto, si leggono i file in logrotate.d e poi si riprende dalla riga successiva a "include". Ovviamente possono essere aggiunti tutti gli "include" che si desiderano.

Info.png Nota
L'opzione "include' risulta particolarmente utile per specificare un file o una directory personalizzata. In questo modo è possibile inserire delle proprie configurazioni senza modificare più di troppo il file logrotate.conf o senza aggiungere file a logrotate.d .


Poiché questo file viene letto per primo, le opzioni contenute in logrotate.conf (ma che si trovano prima di "include") si applicano a tutti i file di log che hanno una sezione di configurazione nello stesso logrotate.conf oppure nei file contenuti in /etc/logrotate.d .
Ad esempio la direttiva:

rotate 4

si applicherà a tutti i file di log, a meno che non venga inserita successivamente una uguale opzione che specifichi diversamente.

/etc/logrotate.d/

In questa directory sono contenuti i file di configurazione per diversi log di sistema. Questi file vengono tipicamente installati da diversi pacchetti per gestire propri file di log.
I file contenuti in questa directory sono letti da logrotate in ordine alfabetico e, a meno che non abbiano una estensione particolare (vedere la direttiva tabooext), vengono visti tutti come file di configurazione.

Ad esempio:

/etc/logrotate.d/consolekit
viene installato tramite il pacchetto consolekit e istruisce logrotate su come gestire il file di log /var/log/Consolekit/history
/etc/logrotate.d/dpkg
viene installato tramite il pacchetto dpkg e istruisce logrotate su come gestire i file di log /etc/log/dpkg.log e /var/log/alternatives.log
/etc/logrotate.d/rsyslog
viene installato tramite il pacchetto rsyslog e istruisce logrotate su come gestire importanti file di log tra cui /var/log/kern.log, /var/log/syslog e /var/log/auth.log
Warning.png ATTENZIONE

Prestare particolare attenzione al fatto che i file presenti in logrotate.d sono in tutto e per tutto dei file di configurazione di logrotate e non solo relativi a un particolare file di log. Una opzione globale, contenuta cioè al di fuori delle parentesi graffe, si applica a tutti i file successivi.
A meno che non abbiate un motivo valido per farlo, tutti i file che si trovano in /etc/logrotate.d/ non hanno e non dovrebbero avere direttive al di fuori delle parentesi graffe.


/var/lib/logrotate/status

Questo è il file in cui sono contenuti gli orari (timestamp) in cui è avvenuta l'ultima rotazione per un particolare file. La forma di questo file è:

nome_file_di_log timestamp

quindi per ogni file viene specificato un timestamp che viene aggiornato dopo ogni rotazione.
logrotate, ad ogni sua esecuzione, consulta questo file per determinare se la rotazione deve avvenire o meno; inserisce anche nuove linee se sono state aggiunte configurazioni per altri file di log.

Opzioni

Fino ad ora si è scritto di come le opzioni per logrotate siano contenute nel file /etc/logrotate.conf e nei file presenti in /etc/logrotate.d/. Adesso si cercherà di spiegare come funzionano le direttive e in cosa consistono.
Le direttive di logrotate possono essere di due tipi:

  • Direttive globali: si applicano a tutti i file ruotati da logrotate. Andrebbero inserite esclusivamente nel file /etc/logrotate.conf
  • Direttive locali: si applicano ad un file (o a un gruppo di file) ruotati da logrotate. Queste direttive sono comprese tra parentesi graffe e andrebbero inserite esclusivamente nei file della directory /etc/logrotate.d/

Opzioni globali

Sono direttive per logrotate che si applicano a tutti i file di log. Queste direttive vanno scritte nel file /etc/logrotate.conf e in nessun caso vanno inserite nei file in /etc/logrotate.d/ (al di fuori delle parentesi graffe) a meno che non si sappia esattamente cosa si stia facendo.
Una direttiva globale sovrascrive un'uguale direttiva precedente e si applica a tutti i file di log che seguono. Inserire pertanto in logrotate.conf la direttiva:

 compress 

prima di:

 include /etc/logrotate.d 

significa imporre la compressione per tutti i file di log successivi. Inserirla dopo la direttiva di "include" ha l'effetto di imporre la compressione solo per i file /var/log/wtmp e /var/log/btmp .

Opzioni locali

Sono contenute tra parentesi graffe e si applicano solo al/ai file di log a cui si riferiscono. Le opzioni locali possono sovrascrivere le opzioni globali, anzi questo è ciò che accade normalmente.

Ad esempio il file logrotate.conf contiene:

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

in cui ci sono quattro direttive locali per il file /var/log/btmp; l'ultima di queste ("rotate 1") sovrascrive l'analoga direttiva globale contenuta nel file ("rotate 4")
Altro esempio è il file /etc/logrotate.d/consolekit che contiene:

rotate 6

anch'esso sovrascrive l'analoga direttiva contenuta in /etc/logrotate.conf .

Le direttive locali possono essere applicate anche a più di un file:

/path/file1 /path/file2 {
...
...
}

oppure:

/path/file1
/path/file2 {
...
...
}

o anche:

"/path/file1"
/path/file2 {
...
...
}

i doppi apici sono necessari nel caso in cui si abbia la necessità di inserire un nome di file che contenga ad esempio degli spazi.

Opzioni disponibili

Qui di seguito verranno elencate le opzioni più comuni per logrotate. Alcune di esse hanno una corrispettiva opzione che ne disabilita il comportamento (normalmente è un'opzione locale che disabilita/sovrascrive un'opzione globale). Alcune vanno inserite senza ulteriori aggiunte, altre devono essere seguite da un parametro, altre ancora hanno significato solo se sono state specificate in precedenza altre opzioni. logrotate, nel caso alcune opzioni non siano state definite, può non considerarle oppure considerarle attribuendogli un valore di default. Fare riferimento alla pagina di manuale:

$ man logrotate

per una trattazione completa.

compress, nocompress
Indica a logrotate se procedere o meno con la compressione dei file ruotati. L'opzione di default è "nocompress", per cui si avranno: miolog, miolog.1, miolog.2 e così via mentre, se "compress" è specificato, si otterrà miolog, miolog.1.gz, miolog.2.gz e così via.
Notare che in logrotate.conf l'opzione "compress' è commentata:

#compress

questo significa che tutti i log, a meno che non abbiano l'opzione locale "compress", non saranno compressi.
Il comando di compressione utilizzato è gzip.

compresscmd Questa opzione può essere utilizzata per specificare un comando diverso da gzip con cui effettuare la compressione. Ad esempio:

/var/log/miolog {
  weekly
  rotate 4
  compress
  compresscmd /usr/bin/lzma
  compressext .lzma
}   

per usare lzma al posto di gzip.

uncompresscmd
Come "compresscmd" ma deve essere specificato l'eseguibile con cui decomprimere i file compressi (necessario per inviare i log via email).
Ad esempio, se il programma di compressione è lzma, come programma di decompressione verrà utilizzato unlzma:

/var/log/miolog {
  compress
  compresscmd /usr/bin/lzma
  uncompresscmd /usr/bin/unlzma
  compressext .lzma
  mail root
}

Di default viene utilizzato gunzip.

compressext
L'estensione del file compresso creato con la rotazione. Di default è ".gz". Se è stata utilizzata l'opzione "compresscmd", modificare l'estensione in base al comando scelto; ad esempio:

/var/log/miolog {
  compress
  compresscmd /usr/bin/lzma
  compressext .lzma
}    

compressoptions
Se si vuole eseguire il comando di compressione con delle opzioni, questo è il posto per specificarle. Di default viene utilizzato "gzip" e le sua opzione di default è "-9" (massima compressione).

copy, nocopy
Con "copy", come si può immaginare, viene effettuata una copia del file di log e la compressione avviene su quest'ultima. Il file di log di partenza viene lasciato inalterato. Questa opzione inibisce "create" che non avrà effetto.
Necessaria se il logging del programma non può essere temporaneamente sospeso durante la rotazione.
L'opzione di default è "nocopy".

copytruncate, nocopytruncate
Come "copy" ma il file di log di partenza viene troncato a zero byte. Notare che esiste sempre un intervallo di tempo che intercorre tra la copia e il troncamento, in questo intervallo si può avere la perdita di messaggi di logging.
L'opzione di default è "nocopytruncate".

create, nocreate
Viene creato un nuovo file di log subito dopo la rotazione. Quindi, se miolog viene ruotato in miolog.1.gz, verrà creato un nuovo file miolog che, di default, avrà gli stessi attributi del precedente. Questo comportamento può essere modificato specificando esplicitamente i nuovi attributi e l'utente/gruppo proprietario del file:

create 666 pippo:disney

farà in modo che il file creato abbia i permessi di lettura e scrittura per tutti e appartenga all'utente "pippo" e al gruppo "disney".

daily, monthly, weekly, yearly
Quando ruotare il file di log (una volta al giorno, una a settimana, una al mese o una all'anno).
logrotate si avvia una volta al giorno al minuto/ora giornalieri specificati in /etc/crontab (sempre che non sia installato anacron), quindi confronta il timestamp con la data corrente e procedere alla rotazione in base all'opzione specificata.
Se il log da ruotare è più vecchio di un giorno rispetto al timestamp ed è specificato 'daily', il log viene ruotato.
Se il log da ruotare è più vecchio di una settimana rispetto al timestamp ed è specificato 'weekly', il log viene ruotato.
Se il log da ruotare è più vecchio di un mese rispetto al timestamp ed è specificato 'monthly', il log viene ruotato.
Se il log da ruotare è più vecchio di un anno rispetto al timestamp ed è specificato 'yearly', il log viene ruotato.

Ovviamente deve essere specificata solo una delle precedenti opzioni; se non viene specificato nulla, viene utilizzata "daily".

dateext, nodateext, dateformat, dateyesterday
Il file ruotato ha, di default, l'estensione contenente un numero (ad es. miofile.1 o, se compresso, miofile.1.gz).
Questa opzione permette di sostituire il numero con la data corrente nel formato YYYYMMDD. Ad esempio con:

/var/log/miolog {
  ...
  dateext
  ...
}

il log ruotato sarà miolog-20140811 o, se compresso, miolog-20140811.gz .
"dateyesterday" permette di creare l'estensione con la data del giorno precedente alla rotazione, mentre con "dateformat" si può personalizzare il formato che la data dovrà utilizzare:

/var/log/miolog {
  ...
  dateext
  dateformat -creato_il_%Y%m%d
  ...
}

e il log ruotati saranno del tipo miolog-creato_il_20140811.gz .
"nodateext" permette di disabilitare l'opzione "dateext" se definita in precedenza come opzione globale.

delaycompress, nodelaycompress
Se è specificato "compress", il primo log ruotato subirà un ritardo ("delay") nella compresssione che partirà dalla seconda rotazione in poi. Il risultato è quello di avere miolog, miolog.1, miolog.2.gz, miolog.3.gz e così via.
Di default, se è specificato "compress", viene utilizzato "nodelaycompress" per cui non c'è nessun ritardo e i log saranno del tipo: miolog, miolog.1.gz, miolog.2.gz .

ifempty, notifempty
La rotazione viene effettuata anche se il file di log è vuoto ("ifempty") oppure solo se il file di log non è vuoto ("notifempty").
L'opzione di default è "ifempty".

include file_or_directory
Con l'opzione "include" si può specificare un file o una directory da cui leggere ulteriori configurazioni di logrotate.
L'utilità di "include" risulta evidente se abbiamo un file di configurazione personalizzato o una directory contenente configurazioni personalizzate per i nostri file di log, in questo modo eviteremo di "sporcare" il file logrotate.conf o la directory logrotate.d; basterà aggiungere a logrotate.conf ad esempio:

...
include /percorso/del/file/mylogrotate
...

notare che bisognerà inserire il path completo del file.

Lo stesso discorso vale anche per una directory:

...
include /path/della/directory/mylogdir/
...

in questo modo verranno letti tutti i file di configurazione presenti nella directory specificata.

mail, nomail, mailfirst, maillast
Queste opzioni possono essere utilizzate per inviare via email i log ruotati. I log, se compressi, verranno decompressi prima di essere inviati (vedere l'opzione "uncompresscmd").
"mail" deve essere seguita da un indirizzo di posta valido e serve per inviare via email il log che sta per essere cancellato (se vi sono quattro rotazioni, sarà inviato il log miolog.5 o miolog.5.gz) o il log appena ruotato (miolog.1 o miolog.1.gz).
Tutti i file riprendono poi il loro normale comportamento (miolog.5.gz verrà cancellato, i file ruotati e miolog.1.gz resterà nella directory).
Facciamo qualche esempio:

/var/log/miolog {
  ...
  mail root
  ...
}

verrà inviato a root il log che sta per essere cancellato dopo la rotazione. Questa sintassi è equivalente a:

/var/log/miolog {
  ...
  mail root
  maillast
  ...
}

Mentre con:

/var/log/miolog {
  ...
  mail root
  mailfirst
  ...
}

Verrà inviato a root il file appena ruotato.

size, maxsize, minsize
Permettono di ruotare i file in base alla loro grandezza.
Queste opzioni devono essere seguite da una numero che indica i kilobyte (k), i megabyte (M) o i gigabyte (G); se non viene specificato nulla, si assumerà una grandezza espressa in byte.
Ad esempio:

/var/log/miolog {
  ...
  size 500
  ...
}

oppure:

/var/log/miolog {
  ...
  size 500k
  ...
}

oppure:

/var/log/miolog {
  ...
  size 1M
  ...
}

oppure:

/var/log/miolog {
  ...
  size 2G
  ...
}

Ci si potrebbe chiedere: se si ha la seguente configurazione:

/var/log/miolog {
  ...
  monthly
  size 1M
  ...
}

quando verrà ruotato "miolog"?
Possibili risposte:
A) Ogni mese ma solo se il file raggiunge 1M
B) Ogni mese ma anche quando il file raggiunge 1M
C) Ogni volta che il file raggiunge 1M, ma solo se è passato un mese

La risposta è B: ogni mese ma anche quando il file supera 1M.
Questo vuol dire che il confronto sulla data e sulla dimensione sono in "OR" logico; basta che una delle due condizioni sia verificata perché avvenga la rotazione e sia aggiornato il file var/lib/logrotate/status .

Da questo comportamento dovrebbero risutare chiare due cose:
1) se ci si aspetta una rotazione alla fine del mese (diciamo il 25 agosto) ma la dimensione del log raggiunge 1M il 20 agosto, il log viene ruotato prima e il successivo confronto con la data verrà fatto il 20 settembre (e così via, teoricamente si può avere una rotazione del log senza che venga mai fatto un confronto tra date).
2) non si può fare affidamento sul periodo di rotazione impostato per il log; lo svantaggio è quello, ad esempio, di trovarsi con dodici rotazioni distanziate di un giorno anche se la configurazione era di dodici rotazioni distanziate di un mese.

"minsize" e "maxsize" sono molto simili a "size" se non per il fatto che il confronto tra date viene comunque eseguito.
Facciamo l'esempio di "maxsize":

/var/log/miolog {
  ...
  monthly
  maxsize 1M
  ...
}

Se il log raggiunge 1M, avviene la rotazione ma non viene modificato il timestamp, per cui la rotazione prevista dopo il periodo indicato (nell'esempio è un mese) viene comunque eseguita.
Il risultato è quello di avere dei log ruotati con una dimensione massima di 1M e distanziati al più di un mese (ma potrebbero essere distanziati di un intervallo temporale minore).

Con "minsize" avviene qualcosa di analogo:

/var/log/miolog {
  ...
  monthly
  minsize 500k
  ...
}

Dopo un mese viene controllata la dimensione, se questa non supera i 500k allora la rotazione non avviene, il timestamp non viene aggiornato e si rinvia tutto alla successiva esecuzione di logrotate.
Il risultato è quello di avere dei log ruotati con una dimensione minima di 500k e distanziati di almeno un mese (ma potrebbero essere distanziati di un intervallo temporale maggiore).

Si scelga, pertanto, con particolare cura il valore di queste opzioni per non incappare in comportamenti imprevisti.

missingok, nomissingok
Se il file di log non esiste, logrotate terminerà con un messaggio d'errore. Se è specificato "missingok", logrotate non segnalerà nulla.
Di default è utilizzata "nomissingok".

olddir, noolddir(d)
La directory in cui vengono salvati i file ruotati (siano essi compressi o meno). Se viene specificata una directory solo con il proprio nome, questa si deve trovare nella stessa directory in cui si trova il file di log. Può essere specificato un percorso assoluto per bypassare questo comportamento.
Esempio:

"/var/log/miolog" {
  ...
  olddir vecchi
  ...
}

i log ruotati verranno salvati nella directory /var/log/vecchi/ .
Con:

"/var/log/miolog" {
  ...
  olddir /local
  ...
}

i log ruotati verranno salvati in /local .

Le directory specificate devono esistere prima di poter essere utilizzate e devono trovarsi sullo stesso dispositivo fisico su cui si trova il file di log.
"noolddir" è il comportamento di default.
Un risultato tipico dell'opzione "olddir", se inserita in "logrotate.conf", è quello di trovarsi tutti i log ruotati in una sola directory ma diversa da /var/log .

postrotate/endscript
Possono essere eseguiti dei comandi subito dopo la rotazione del file, questi devono essere compatibili con /bin/sh (di default è un link a dash) e vanno inseriti tra le parole "postrotate" e "endscript".

/var/log/miolog {
  monthly
  compress
  postrotate
    chgrp utente $1
  endscript
}

Il primo parametro ($1) è il nome del log appena ruotato (effettuare prima una prova, non fateci troppo affidamento) e il precedente esempio cambia il gruppo proprietario del file.
Ad esempio, se si vuol fare in modo che il file syslog.1 abbia permessi root:utente, modificare il file /etc/logrotate.d/rsyslog in questo modo:

/var/log/syslog {
  rotate 7
  daily
  missingok
  notifempty
  delaycompress
  compress
  postrotate
    service rsyslog rotate > /dev/null
    chgrp utente $1
  endscript
}

ora "utente" ha i permessi di lettura per syslog.1 e per tutti i file creati con le successive rotazioni.

Warning.png ATTENZIONE
Quello appena fatto è solo un esempio. Se si vuole avere i permessi di lettura per i file di log, aggiungere il proprio utente al gruppo "adm".

Inoltre l'esempio precedente funziona solo su file non compressi; per operare sul file compresso, bisogna utilizzare "lastaction"


È importante sottolineare che in caso di una configurazione comune a più file:

/var/log/miolog1
/var/log/miolog2
/var/log/miolog3
/var/log/miolog4 {
  ...
  postrotate
    ...
  endscript
  ...
}

tutto ciò che è incluso tra "postrotate/endscript" verrà eseguito per ogni file di log che verrà ruotato. Questo comportamento può essere cambiato con l'opzione "sharedscripts" in modo da eseguire "postrotate/endscript" una sola volta.

prerotate/endscript
Come "postrotate" eccetto per il fatto che le operazioni tra le parole "prerotate" e "endscript" vengono eseguite prima della rotazione

firstaction/endscript
lastaction/endscript
Esattamente come "prerotate/endscript" e "postrotate/endscript" ma i comandi vengono eseguiti prima di "prerotate" oppure dopo "postrotate". "lastaction" deve essere utilizzato per operare sul file compresso.
La sequenza sarà quindi: firstaction -> prerotate -> rotazione -> postrotate -> lastaction .

rotate count
Il numero di rotazioni dopo cui, di default, il log più vecchio viene eliminato (o salvato o inviato per email, dipende dalla configurazione scelta).
Ad esempio:

/var/log/miolog {
  ...
  rotate 3
  ...
}

dopo tre rotazioni si avrà: miolog, miolog.1.gz, miolog.2.gz e miolog.3.gz .
Alla successiva rotazione miolog.3.gz verrà cancellato e il suo posto verrà preso da miolog.2.gz che verrà rinominato in miolog.3.gz procedendo a cascata per i file miolog.1.gz e miolog .
Di default il valore per "rotate" è 0, ossia il log ruotato viene immediatamente cancellato.

shred, noshred, shredcycles numero
Dopo il numero di rotazioni definito (es. quattro rotazioni), il comportamento di default è quello di cancellare il log più vecchio (es. miofile.4.gz).
Con questa opzione si utilizza shred per una cancellazione sicura del file.

Ad esempio si può inserire in logrotate.conf le seguenti righe:

...
shred
shredcycles 4
...

per utilizzare la cancellazione sicura per tutti i file di log che stanno per essere eliminati (a meno che non sia stato specificato noshred per un particolare file).
"shredcycles" è seguito da un numero che indica quante sovrascritture verranno utilizzate da shred, se non si specifica questa opzione, shred utilizzerà il numero di sovrascitture predefinito (tre). Vedere anche "man shred".
Questa opzione stabilisce solo le modalità di cancellazione, l'invio tramite email (se impostato) sarà ancor valido.
L'opzione di default è "noshred".

start count
Il numero da cui si parte per contrassegnare i file ruotati. Di default è uno.
Con:

/var/log/miolog {
  weekly
  rotate 4
  compress
  start 3
}

Si avranno: miolog, miolog.3.gz, miolog.4.gz, miolog.5.gz, miolog.6.gz .

su user group
Il gruppo e l'utente con cui viene eseguito logrotate. Attenzione: l'uso di questa opzione non porta alla creazione dei file ruotati con le credenziali qui definite.
Di default logrotate viene eseguito con le credenziali "root:root" .

tabooext [+] list
Di default tutti i file contenuti nella directory /etc/logrotate.d/ o nelle directory specificate con l'opzione "include" vengono visti come file di configurazione. Tutti eccetto quelli con estensioni predefinite (vedere la manpage di logrotate) e quelli specificati con questa opzione.
Il carattere "+" aggiunge un'estensione alla lista predefinita'. Senza "+" le estensioni sostituiranno la lista predefinita.
Quindi con:

/var/log/miolog {
  weekly
  rotate 4
  compress
  tabooext + .readme
}

verrà aggiunta l'estensione ".readme" alla lista predefinita. In questo modo è possibile creare un file (ad es. LEGGIMI.readme) in logrotate.d in cui scrivere annotazioni sulle operazioni personalizzate (file creati, quali opzioni sono state modificate, dove, per quale file) che si sono scelte per logrotate; in questo modo il file LEGGIMI.readme non verrà considerato come un file di configurazione.
Se si vogliono più estensioni, separarle con una virgola:

tabooext + .readme, .leggimi, .info, .txt

Personalizzare logrotate.d

Per "personalizzazione" di logrotate si intendono due aspetti:

  • Modificare la configurazione di logrotate.d nella gestione dei log di sistema
  • Modificare la configurazione di logrotate.d nella gestione dei log di applicazioni personalizzate

Log di sistema

Tipicamente le configurazioni di default in "logrotate.conf" e "logrotate.d/" vanno più che bene.
Se si decide di modificarle, tener presente che gli aggiornamenti di logrotate.d o dei programmi che creano file in logrotate.d potrebbero tentare una sovrascrittura nel caso abbiano apportato dei cambiamenti nei file di configurazione di default.
La soluzione più semplice è utilizzare l'opzione "include" e un file di configurazione personalizzato oppure, se i cambiamenti sono pochi, modificare logrotate.conf ed effettuare un backup del file modificato.

Modificate con attenzione il file logrotate.conf e, se possibile, non toccate i file che si trovano nella directory "logrotate.d/" a meno che non conosciate con precisione le conseguenze che avranno i vostri cambiamenti.

Log personali

Se avete l'esigenza di ruotare dei file di log personali (magari creati da una vostra applicazione o da un vostro script) consiglio di non toccare il file logrotate.conf né di aggiungere altri file alla directory logrotate.d ; piuttosto eseguite logrotate all'interno di cron in modo che legga un vostro file o una vostra directory contenente tutte le vostre configurazioni personali.
Ad esempio:

00 12 * * * logrotate -s /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf

In questo modo verrà eseguito logrotate alle 12,00 di ogni giorno e considererà solo ciò che è contenuto in /usr/local/etc/miologrotate.conf utilizzando il file /usr/local/etc/miologrotate.status per i timestamp.
Il beneficio è quello di non intaccare minimamente il funzionamento di logrotate per i file di sistema.

Un esempio chiarisce il concetto.
Supponiamo di avere uno script che scrive i suoi log nel file /home/pluto/mylogs/mylog.log e che si abbia la necessità di doverlo ruotare affinché non cresca troppo; si vuole anche che i log più vecchi non vengano cancellati ma salvati nella directory /home/pluto/backuplogs/ .
A tal scopo creiamo innanzitutto, con i permessi di root, due file:

  • /usr/local/etc/miologrotate.status
  • /usr/local/etc/miologrotate.conf

inizialmente vuoti:

# touch /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf

Poi modifichiamo miologrotate.conf così:

/home/pluto/mylogs/mylog.log {
  daily
  rotate 1
  copytruncate
  notifempty
  missingok
  dateext
  compress
  delaycompress
  compresscmd /usr/bin/lzma
  uncompresscmd /usr/bin/unlzma
  compressext .lzma
  mail pluto
  lastaction
    cp /home/pluto/mylogs/mylog.log*.lzma /home/pluto/backuplogs/
  endscript
}

e aggiungiamo un job di cron per root:

0 0 * * * /usr/sbin/logrotate -s /usr/local/etc/miologrotate.status /usr/local/etc/miologrotate.conf

Ora, a mezzanotte di ogni giorno, viene eseguito logrotate. Se è passato un giorno dall'ultima rotazione, il log viene ruotato, compresso con lzma, inviato via email all'utente "pluto" e copiato nella directory /home/pluto/backuplogs/ con il nome comprensivo della data.
Vi è un'unica rotazione ("rotate 1") per cui esisterà solo un file .lzma nella directory, questo file viene comunque subito spostato in /home/pluto/backuplogs/ (direttiva lastaction). Tutti i permessi dei file compressi rimangono gli stessi del file iniziale mylog.log .




Guida scritta da: S3v 11:57, 13 ago 2014 (CEST)
(guida originariamente scritta da MaXeR)
Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized