Logrotate: configurare la rotazione automatica dei log: differenze tra le versioni
S3v (discussione | contributi) mNessun oggetto della modifica |
|||
(12 versioni intermedie di 3 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{ | {{Versioni compatibili}} | ||
[[ | == 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/> | |||
Se <code>logrotate</code> è già installato sulla nostra macchina, si possono vedere i risultati del suo funzionamento aprendo una [[shell]] ed eseguendo: | |||
<pre>$ ls -l /var/log</pre> | |||
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 == | ||
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à | 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> . | |||
== | Le direttive locali possono essere applicate anche a più di un file: | ||
<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''. | |||
'''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> | ||
/var/log/miolog { | |||
compress | |||
compresscmd /usr/bin/lzma | |||
. | uncompresscmd /usr/bin/unlzma | ||
compressext .lzma | |||
mail root | |||
} | } | ||
</pre> | </pre> | ||
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> | |||
'''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". | |||
'''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. | |||
Ovviamente deve essere specificata solo una delle precedenti opzioni; se non viene specificato nulla, viene utilizzata "daily". | |||
'''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/ | /var/log/miolog { | ||
... | |||
dateext | |||
... | |||
} | } | ||
</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). | |||
Con "minsize" avviene qualcosa di analogo: | |||
<pre> | <pre> | ||
/var/log/ | /var/log/miolog { | ||
... | |||
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". | |||
'''start count'''<br/> | |||
<pre>/var/log/ | Il numero da cui si parte per contrassegnare i file ruotati. Di default è uno.<br/> | ||
Con: | |||
<pre> | |||
/var/log/miolog { | |||
weekly | |||
rotate 4 | |||
compress | |||
start 3 | |||
} | |||
</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" . | |||
== | '''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 = | |||
}} | |||
[[Categoria:Shell]] [[Categoria:Monitoraggio]] [[Categoria: Servizi di sistema]] |
Versione attuale delle 08:36, 18 giu 2016
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.
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.
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 istruiscelogrotate
su come gestire importanti file di log tra cui/var/log/kern.log
,/var/log/syslog
e/var/log/auth.log
/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.
È 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) |
Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |