Una delle directory più interessanti (e forse anche una delle più importanti) in un sistema Linux è /var/log
. Secondo il Filesystem Hierarchy Standard, l’attività della maggior parte dei servizi in esecuzione nel sistema sono scritti in un file all’interno di questa directory o di una delle sue sottodirectory.
Tali file sono noti come log e sono la chiave per esaminare come il sistema sta funzionando (e come si è comportato in passato). I log sono anche la prima fonte di informazioni dove gli amministratori e gli ingegneri guardano durante la risoluzione dei problemi.
Se guardiamo il contenuto di /var/log
su un CentOS/RHEL/Fedora e Debian/Ubuntu (per varietà) vedremo i seguenti file di log e sottodirectory.
Si prega di notare che il risultato potrebbe essere un po’ diverso nel vostro caso a seconda dei servizi in esecuzione sul vostro sistema (o sui vostri sistemi) e del tempo in cui sono stati eseguiti.
In RHEL/CentOS e Fedora
# ls /var/log
In Debian e Ubuntu
# ls /var/log
In entrambi i casi, possiamo osservare che alcuni dei nomi dei log terminano come previsto in “log”, mentre altri sono rinominati utilizzando una data (ad esempio, maillog-20160822 su CentOS) o compressi (si consideri auth.log.2.gz e mysql.log.1.gz su Debian).
Questo non è un comportamento predefinito in base alla distribuzione scelta, ma può essere cambiato a piacimento usando le direttive nei file di configurazione, come vedremo in questo articolo.
Se i log fossero tenuti per sempre, finirebbero per riempire il filesystem dove risiede /var/log. Per evitare ciò, l’amministratore di sistema può usare una simpatica utility chiamata logrotate per ripulire i log su base periodica.
In poche parole, logrotate rinominerà o comprimerà il log principale quando si verifica una condizione (ne parleremo tra un minuto) in modo che il prossimo evento venga registrato su un file vuoto.
Inoltre, rimuoverà i file di log “vecchi” e manterrà quelli più recenti. Naturalmente, siamo noi a decidere cosa significa “vecchio” e quanto spesso vogliamo che logrotate pulisca i log per noi.
Installazione di Logrotate in Linux
Per installare logrotate, usate semplicemente il vostro gestore di pacchetti:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
È bene notare che il file di configurazione (/etc/logrotate.conf
) può indicare che altre impostazioni più specifiche possono essere messe su singoli file .conf
all’interno di /etc/logrotate.d.
Questo sarà il caso se e solo se la seguente linea esiste e non è commentata:
include /etc/logrotate.d
Assumeremo questo approccio, poiché ci aiuterà a mantenere le cose in ordine, e useremo la scatola Debian per i seguenti esempi.
Configurare Logrotate in Linux
Essendo uno strumento molto versatile, logrotate fornisce molte direttive per aiutarci a configurare quando e come i log saranno ruotati, e cosa dovrebbe succedere subito dopo.
Inseriamo i seguenti contenuti in /etc/logrotate.d/apache2.conf (si noti che molto probabilmente si dovrà creare quel file) ed esaminiamo ogni linea per indicare il suo scopo:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
La prima riga indica che le direttive all’interno del blocco si applicano a tutti i log all’interno di /var/log/apache2:
- weekly significa che lo strumento tenterà di ruotare i log su base settimanale. Altri valori possibili sono daily e monthly.
- rotate 3 indica che solo 3 log ruotati dovrebbero essere conservati. Così, il file più vecchio sarà rimosso alla quarta esecuzione successiva.
- size=10M imposta la dimensione minima per la rotazione a 10M. In altre parole, ogni log non sarà ruotato finché non raggiunge i 10MB.
- compress e delaycompress sono usati per dire che tutti i log ruotati, ad eccezione del più recente, dovrebbero essere compressi.
Eseguiamo un dry-run per vedere cosa farebbe logrotate se fosse effettivamente eseguito ora. Usa l’opzione -d
seguita dal file di configurazione (puoi effettivamente eseguire logrotate omettendo questa opzione):
# logrotate -d /etc/logrotate.d/apache2.conf
I risultati sono mostrati sotto:
Invece di comprimere i log, potremmo rinominarli dopo la data di rotazione. Per farlo, useremo la direttiva dateext
. Se il nostro formato di data è diverso da quello predefinito yyyymmdd, possiamo specificarlo usando dateformat.
Nota che possiamo anche impedire che la rotazione avvenga se il log è vuoto con notifempty. Inoltre, diciamo a logrotate di spedire il log ruotato all’amministratore di sistema ([email protected] in questo caso) per il suo riferimento (questo richiederà la configurazione di un server di posta, che non rientra nello scopo di questo articolo).
Se vuoi ricevere email su logrotate, puoi configurare il server di posta Postfix come mostrato qui: Install Postfix Mail Server
Questa volta useremo /etc/logrotate.d/squid.conf per ruotare solo /var/log/squid/access.log:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail [email protected]}
Come possiamo vedere nell’immagine sottostante, questo log non ha avuto bisogno di essere ruotato. Tuttavia, quando la condizione di dimensione è soddisfatta (size=1M), il log ruotato sarà rinominato access.log-25082020 (se il log è stato ruotato il 25 agosto 2020) e il log principale (access.log) sarà ricreato con i permessi di accesso impostati a 0644 e con root come proprietario e proprietario del gruppo.
Infine, quando il numero di log raggiunge finalmente i 6, il log più vecchio sarà inviato a [email protected].
Ora supponiamo di voler eseguire un comando personalizzato quando avviene la rotazione. Per farlo, mettete la linea con tale comando tra le direttive postrotate e endscript.
Per esempio, supponiamo di voler inviare un’email a root quando uno qualsiasi dei log all’interno di /var/log/myservice viene ruotato. Aggiungiamo le linee in rosso a /etc/logrotate.d/squid.conf:
/var/log/myservice/* {monthlycreate 0644 root rootrotate 5size=1M postrotate echo "A rotation just took place." | mail root endscript}
Infine, ma non meno importante, è importante notare che le opzioni presenti in /etc/logrotate.d/*.conf
sovrascrivono quelle del file di configurazione principale in caso di conflitti.
Logrotate e Cron
Di default, l’installazione di logrotate crea un file crontab dentro /etc/cron.daily chiamato logrotate. Come nel caso degli altri file crontab all’interno di questa directory, verrà eseguito ogni giorno a partire dalle 6:25 se anacron non è installato.
Altrimenti, l’esecuzione inizierà intorno alle 7:35. Per verificare, guarda la linea contenente cron.daily in /etc/crontab o /etc/anacrontab.
Sommario
In un sistema che genera diversi log, l’amministrazione di tali file può essere notevolmente semplificata utilizzando logrotate. Come abbiamo spiegato in questo articolo, ruoterà, comprimerà, rimuoverà e spedirà automaticamente i log su base periodica o quando il file raggiunge una certa dimensione.
Basta assicurarsi che sia impostato per essere eseguito come cron job e logrotate vi renderà le cose molto più facili. Per maggiori dettagli, fate riferimento alla pagina man.