Gestione dei log con logrotate su Ubuntu 16.04
Come configurare logrotate per gestire i log di sistema e delle applicazioni.
Logrotate è un'utility di sistema che gestisce la rotazione automatica, la compressione e la pulizia dei file di log. Senza una gestione adeguata, i log di un server attivo da lungo tempo finiscono per occupare silenziosamente tutto lo spazio su disco disponibile — logrotate evita che questo diventi un problema.
Su Ubuntu 16.04, logrotate è preinstallato e già configurato per gestire la rotazione dei log di tutti i pacchetti di sistema e delle applicazioni.
Verificare l'installazione
logrotate --version
Dovresti vedere qualcosa di simile a:
logrotate 3.8.7
Struttura della configurazione
La configurazione di logrotate si trova in due posti:
/etc/logrotate.conf— il file di configurazione principale, con i valori predefiniti globali e i template per i file non di sistema/etc/logrotate.d/— una directory con file di configurazione per singolo servizio, che estendono o sovrascrivono i valori predefiniti globali
Prendiamo come esempio la configurazione integrata per apt:
cat /etc/logrotate.d/apt
Output:
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
Questo file definisce le regole di rotazione per term.log e history.log. Qualsiasi direttiva non specificata qui ricade sui valori predefiniti globali in /etc/logrotate.conf.
Cosa fa ciascuna direttiva:
rotate 12— conservare 12 copie archiviate prima di eliminare le più vecchiemonthly— eseguire la rotazione una volta al mesecompress— comprimere i log archiviati (gzip per impostazione predefinita)missingok— non generare un errore se il file di log non esistenotifempty— saltare la rotazione se il file di log è vuoto
Metodo 1 — Aggiungere una configurazione in /etc/logrotate.d/
Questo è l'approccio standard per la maggior parte delle applicazioni. La configurazione viene eseguita quotidianamente come root insieme a tutti gli altri job di logrotate.
Ecco un esempio per un'applicazione che scrive access.log e error.log in /var/log/example-app/:
sudo nano /etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}
Cosa fa ciascuna direttiva:
create 0640 www-data www-data— creare un nuovo file di log vuoto dopo la rotazione con permessi0640, di proprietà diwww-datasharedscripts— eseguire lo scriptpostrotateuna sola volta dopo che tutti i file corrispondenti sono stati elaborati, anziché una volta per filepostrotate ... endscript— comandi da eseguire dopo la rotazione; in questo esempio l'applicazione viene ricaricata in modo che utilizzi il nuovo file di log
Una volta configurato, esegui un test senza apportare modifiche reali:
sudo logrotate /etc/logrotate.conf --debug
Questa modalità di prova mostra in dettaglio cosa farebbe logrotate — nulla viene modificato.
I nostri prodotti e servizi
Metodo 2 — Configurazione personalizzata con pianificazione cron
Se hai bisogno di una rotazione con una pianificazione non standard — ad esempio ogni ora — conviene creare una configurazione al di fuori di /etc/logrotate.d/ e avviarla manualmente tramite cron.
In questo esempio, l'applicazione è in esecuzione come utente newuser e scrive i log in /home/newuser/logs/. Crea un file di configurazione locale:
nano /home/newuser/logrotate.conf
/home/newuser/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Questa configurazione ruoterà i log ogni ora, conservando 24 archivi compressi e creando un nuovo file di log ogni volta.
Crea la directory dei log e un file di test:
cd ~
mkdir logs
touch logs/access.log
Esegui logrotate manualmente, indicando un file di stato personalizzato:
logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state --verbose --force
Output:
reading config file /home/newuser/logrotate.conf
Handling 1 logs
rotating pattern: /home/newuser/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/newuser/logs/access.log
log does not need rotating
--verbosestampa un resoconto dettagliato di tutto ciò che logrotate esegue.--forceforza la rotazione indipendentemente dal fatto che sia dovuta o meno.--stateindica a logrotate dove salvare il registro dell'ultima esecuzione.
Verifica il contenuto del file di stato:
cat /home/newuser/logrotate-state
Output:
logrotate state -- version 2
"/home/newuser/logs/access.log" 2020-05-18-16:0:0
È così che logrotate tiene traccia di cosa ha elaborato e quando — in modo da sapere esattamente cosa fare alla prossima esecuzione. Esegui lo stesso comando un'ora dopo e il log verrà ruotato come previsto.
Automatizzare con cron
Per far eseguire logrotate automaticamente ogni ora, aggiungi un job cron:
crontab -e
Aggiungi questa riga alla fine del file:
14 * * * * /usr/sbin/logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state
Il job verrà eseguito al 14° minuto di ogni ora, ogni giorno.
Aiuto
Hai domande o ti serve una mano? Scrivici tramite il sistema di ticket — siamo sempre qui per aiutarti!