Oggi parliamo di un comando linux veramente molto utile (anche se aimè troppo poco conosciuto) che consente di controllare la dimensione dei files di log presenti nel nostro sistema.
Nella mia attività professionale di sistemista linux, ho dovuto spesso avere a che fare con applicazioni che scrivono in maniera estremamente invasiva, tonnellate di files di log senza alcuna politica di retention.
Gli sviluppatori più accurati prevedono la scrittura dei propri file di log, ma non sembrano preoccuparsi troppo di come controllarne le dimensioni.
La triste verità è che poi alla fine se ne accorge il sistemista quando ormai è troppo tardi e il file system dei server inesorabilente si è riempito.
L'utility di cui parlo è presente in quasi tutte le distribuzioni linux e si chiama logrotate.
A nostra insaputa, logrotate si preoccupa di tenere sotto controllo lo spazio su disco occupato dai tantissimi file di log che il sistema operativo produce.
Il logrotate, consente di salvaguardare l’occupazione dello spazio su disco eseguendo una rotazione dei file di log in maniera da evitare la loro crescita incontrollata.
E’ costituito da un eseguibile situato nella cartella /usr/sbin e da alcuni file di configurazione situati sotto /etc/logrotate.d che contengono le direttive per la rotazione dei log.
La schedulazione
Di default con la distribuzione di Ubuntu, il logrotate è già attivo e funzionante.
L’esecuzione del logrotate, viene attivata ogni giorno con il cron di sistema.
Nella cartella /etc sono presenti le seguenti directory:
- cron.hourly
- cron.daily
- cron.weekly
- cron.monthly
Qualunque script messo in queste directory viene eseguito rispettivamente:
- Una volta ogni ora
- Una volta ogni giorno
- Una volta ogni settimana
- Una volta ogni mese
Quando ? Se volete scoprirlo potete gurdarvi il file /etc/crontab, al cui interno troverete le definizioni degli orari impostati in ubuntu.
La cartella cron.daily contiene già di default l’esecuzione di uno script chiamato logrotate con questo contenuto:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
In pratica quindi, di default, il logrotate viene eseguito ogni giorno (alle ore 6.25 AM) con la configurazione definita nel file di configurazione /etc/logrotate.conf.
Ma cosa contiene questo file ? Eccolo:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
Come potete vedere, il file è composto da una serie di direttive predefinite ma, cosa molto importante, contiene una istruzione per includere, nella sua configurazione una serie di impostazioni situate all'interno della directory /etc/logrotate.d.
In pratica in questo file sono scritte le impostazioni di carattere generale che pero’ possono essere sovrascritte da una eventuale configurazione presente in un qualunque file situato sotto /etc/logrotate.d.
Se si vuole aggiungere la rotazione di un proprio log giornaliero è quindi sufficiente creare un file nella directory /etc/logrotate.d con le apposite opzioni di configurazione
I comandi del logrotate
Il file di configurazione del logrotate ha una struttura abbastanza intuitiva. L'elenco complessivo di istruzioni che potete utilizzare lo potete consultare digitando il comando
man logrotate
Ecco un esempio di file di configurazione:
compress
/oracle/app/plitvice/logs/oc4j_err.log {
copytruncate
rotate 5
size=+50M
notifempty
missingok
create 644 oracle oinstall
}
/oracle/app/plitvice/logs/oc4j_out.log {
copytruncate
rotate 5
size=+50M
notifempty
missingok
create 644 oracle oinstall
}
Come si può osservare le direttive possono essere generali, oppure inserite all’interno di sezioni, corrispondenti al nome di un file da ruotare periodicamente.
Le direttive generali valgono fino a dove non vengono modificate; pertanto diventano direttive predefinite.
Nell’esempio appare inizialmente la direttiva compress che significa che i file di archiviazione devono essere compressi.
Piu’ avanti in una delle sezioni specifiche del file, troviamo la direttiva rotate 5 che determina la quantità di cicli, che in questo caso sono cinque.
Molto importante è la direttiva copytruncate che nel caso di file di log sempre attivi, fa in modo che non venga perso l’handle del file con un sua chiusura. In pratica, anziche spostare il file in uno comresso, copia il file, lo comprime e azzera quello esistente.
Se dovere ruotare un file di log di apache, è necessario utilizzare questa direttiva.
Ora che abbiamo tutte le informazioni su come è strutturato un file di configurazione del logrotate, possiamo andare a curiosare su cosa c'è nella nostra cartella /etc/logrotate.d.
Per esempio, nel file apache2 troviamo questo contenuto:
/var/log/apache2/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript
}
Vediamo che vengono mantenuti 52 file e che vengono ruotati, indifferentemente dalla loro dimensione, con periodicità settimanale.
Notiamo inoltre che subito dopo la rotazione, viene eseguito uno script che effettua un reload della configurazione di apache.
Questo probabilmente è necessario perchè l'azzeramento del file di log crea problemi alla scrittura di ulteriori messaggi di errore di apache che ri risolvono con questa istruzione.
Le Direttive principali
Le direttive del logrotate sono davvero tante. E' possibile personalizzare la rotazione come si desidera.
Fra tutte alcune fra le più utilizzate sono le seguenti.
Criteri di rotazione
daily
Rotazione su base giornaliera;
weekly
Rotazione su base settimanale;
monthly
Rotazione su base mensile;
size <dimensione>
Rotazione basata sulla dimensione massima del file
notifempty
La rotazione nonviene eseguita se il file è vuoto
Compressione
compress
Una volta archiviato, il file di log viene compresso tramite gzip
compresscmd
E' possibile specificare un diverso programma per la compressione al posto del gzip
Gestione File
create <mode> <owner> <group>:
Dopo la rotazione viene creato un nuovo file con il nome identico al precedente.
Con questo comando è possibile specificare, modalità di accesso, proprietario e gruppo
copy
Crea una copia del file di log e non modifica l'originale che non viene mai rimosso
copytruncate
Viene utilizzato nel caso in cui non sia possibile chiudere il file di log.
Viene archiviata parte del file di log mentre ne viene eseguita una copia
olddir <directory>
I file di log vengono spostati nella directory indicata prima di eseguire la rotazione
Configurazione
include <file o directory>
Legge il file oppure tutti i file della directory indicata ed applica le direttive incontrate all'interno di essi.
Operazioni Pre-log e Post-log
postrotate endscript
I comandi situati all'interno di queste due direttive vengono eseguiti dopo la rotazione
prerotate endscript
I comandi situati all'interno di queste due direttive vengono eseguiti prima della rotazione
Conclusioni
Come detto, con una sbirciatina al man, troverete il dettaglio delle varie opzioni che sono veramente tante e che consentono di proteggere il vostro file system nel migliore dei modi.
Il logrotate, se configurato correttamente, vi permette di tenere sotto controllo i vostri server creando un ambiente consistente la cui occupazione di spazio su disco non cresce a dismisura e, soprattutto, in maniera incontrollata... come purtroppo accade su altri sistemi operativi.
Buona rotazione a tutti
|