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

riscrittura totale
(riscrittura totale)
Riga 1: Riga 1:
{{Guida da adottare}}
{{Stub}}{{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 può vederne il suo operato aprendo una [[shell]] e 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 ==
Tipicamente <code>logrotate</code> è installato di default su ogni sistema Debian. In caso contrario:
<pre>
# apt-get install logrotate
</pre>
 
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, però, è 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> . Visualizzate mentalmente questo 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


{{stub}}
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>.


== Introduzione ==
=== /etc/cron.daily/logrotate ===
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.
Questo script ha il seguente contenuto:
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.
<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 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<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.
 
=== /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 <code>logrotate</code> in ordine alfabetico e, a meno che non abbiano una estensione particolare (vedi tabooext), vengono visti tutti come file di configurazione.
 
Ad esempio:
;/etc/logrotate.d/consolekit:viene installato tramite il pacchetto consolekit e istruisce <code>logrotate</code> su come gestire il file di log /var/log/Consolekit/history
;/etc/logrotate.d/dpkg:viene installato tramite il pacchetto dpkg e istruisce <code>logrotate</code> 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 <code>logrotate</code> su come gestire importanti file di log tra cui /var/log/kern.log, /var/log/syslog e /var/log/auth.log
 
{{Warningbox|
Prestare particolare attenzione al fatto che i file presenti in logrotate.d 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 /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.
<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 /etc/logrotate.conf 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 logrotate.conf 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.


== Installazione ==
Ad esempio il file logrotate.conf contiene:
Per installare logrotate è sufficiente un
<pre>
<pre>
# apt-get install logrotate
/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}
</pre>
</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 /etc/logrotate.d/consolekit che contiene:
<pre>rotate 6</pre>
anch'esso sovrascrive l'analoga direttiva contenuta in /etc/logrotate.conf


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]].
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.


== Funzionamento ==
'''compress, nocompress'''<br/>
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.
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>
<pre>
PATH_DEL_FILE {
/var/log/miolog {
direttiva_1 valore_1
  weekly
direttiva_2 valore_2
  rotate 4
.....
  compress
direttiva_n valore_n
  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>
/var/log/miolog {
  compress
  compresscmd /usr/bin/lzma
  uncompresscmd /usr/bin/unlzma
  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 /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.<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 bisogna inserire il [[path]] 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'''
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:
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.<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).
     
'''missingok, nomissingok'''<br/>
Se il file di log non esiste, <code>logrotate</code> terminerà con un messaggio d'errore. Se è specificato "missingok", logrotate 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>
</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"}}


=== munin-node ===
È importante sottolineare che in caso di una configurazione comune a più file:
<pre>/var/log/munin/munin-node.log {
<pre>
        daily
/var/log/miolog1
        missingok
/var/log/miolog2
        rotate 7
/var/log/miolog3
        compress
/var/log/miolog4 {
        copytruncate
  ...
        notifempty
  postrotate
        create 640 root adm
    ...
}</pre>
  endscript
  ...
}
</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.


== Definizione di una rotazione personalizzata ==
'''prerotate/endscript'''<br/>
Come "postrotate" eccetto per il fatto che le operazioni tra le parole "prerotate" e "endscript" vengono eseguite prima della rotazione


== Elenco Opzioni ==
'''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 verranno eliminati (a meno che non si 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/>
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 logrotate viene eseguito con le credenziali "root:root" .
'''tabooext [+] list'''<br/>
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 <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.
<pre>
/var/log/miolog {
  weekly
  rotate 4
  compress
  tabooext + .readme
}
</pre>
Aggiunge 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 logortate.d 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 utilizzare 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 di 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>
Poi 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> .
Tutti i permessi dei file compressi rimangono gli stessi del file iniziale <code>mylog.log</code> .
     
     
{{Autori
{{Autori
|Autore = [[Utente:MaXeR|MaXeR]]
|Autore = [[Utente:S3v|S3v]] 11:57, 13 ago 2014 (CEST)<br/>(guida originariamente scritta da [[Utente:MaXeR|MaXeR]])
|Estesa_da =
|Estesa_da =
:[[Utente:Alen192|Alen192]]
}}
}}


[[Categoria:Da Adottare]]
[[Categoria:Shell]] [[Categoria:Monitoraggio]] [[Categoria: Servizi di sistema]]
[[Categoria:Shell]]
[[Categoria:Monitoraggio]]
6 999

contributi