Rotazione e compressione dei log utilizzando logrotate
- Livello: Intermedio
- Tempo stimato: ~20 minuti
- Obiettivo: Configurare logrotate per comprimere e ruotare automaticamente i file di log dell'applicazione per prevenire l'esaurimento dello spazio su disco.
Introduzione
I log sono una parte fondamentale della gestione di qualsiasi applicazione in produzione: senza di essi, comprendere in modo affidabile cosa è andato storto e cosa fare al riguardo sarebbe molto difficile. Un'applicazione molto attiva può generare migliaia di voci al minuto, e tutte queste vengono tipicamente memorizzate in file. Dobbiamo comprimere ed eliminare i log vecchi in modo tempestivo per evitare di esaurire lo spazio su disco. In questo tutorial, configureremo logrotate su un server Linux.
Cos'è logrotate?
logrotate è un'utilità Linux progettata per semplificare l'amministrazione di sistemi che generano un gran numero di file di log. Permette di comprimere, ruotare ed eliminare automaticamente i log. Viene tipicamente eseguito giornalmente, settimanalmente o mensilmente tramite cron o un timer systemd.
Prerequisiti
Prima di iniziare, assicurati che siano soddisfatte le seguenti condizioni:
- Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12, o CentOS/RHEL 7+
- logrotate: versione 3.x (controlla nel passaggio 1)
- Accesso: accesso sudo o root al server
- Conoscenze richieste: uso sicuro della riga di comando di Linux e modifica di file di base
Passaggio 1: Verificare l'installazione di logrotate
Per verificare l'installazione, esegui semplicemente:
logrotate --version
Output previsto:
logrotate 3.19.0 Comando di posta predefinito: /usr/bin/mail Comando di compressione predefinito: /bin/gzip Comando di decompressione predefinito: /bin/gunzip Estensione di compressione predefinita: .gz Percorso del file di stato predefinito: /var/lib/logrotate/status
Se il comando non viene trovato – logrotate non è installato. Installalo:
Debian/Ubuntu:
sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Passaggio 2: Comprendere la struttura della configurazione
Il file di configurazione principale si trova in /etc/logrotate.conf – lo lasceremo invariato per ora. Le nostre regole per servizi specifici andranno in /etc/logrotate.d/ – un file separato dovrebbe essere posizionato lì per ciascun servizio.
Prima di aggiungere qualcosa, controlla se esiste già una configurazione per il tuo servizio:
ls /etc/logrotate.d/
Per servizi popolari come nginx o Apache, le configurazioni sono solitamente già presenti. Se nginx o apache2 è già lì – apri quel file e regola il conteggio delle rotazioni e le impostazioni di compressione in base alle tue esigenze, piuttosto che creare un duplicato.
Passaggio 3: Aggiungere una configurazione di servizio
Supponiamo che ci sia un'applicazione personalizzata e i suoi log si trovino in /opt/myapp/*.log.
Crea e apri il file:
sudo nano /etc/logrotate.d/myapp
Incolla il seguente contenuto all'interno:
/opt/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }
Questa configurazione istruisce logrotate a:
- daily – ruotare i log giornalmente; puoi anche specificare
weeklyomonthly. - missingok – non fallire con un errore se il file di log manca.
- rotate 14 – mantenere 14 copie ruotate prima dell'eliminazione.
- compress – comprimere i log ruotati usando gzip.
- delaycompress – non comprimere la rotazione più recente; utile se l'applicazione mantiene ancora il file aperto.
- notifempty – saltare la rotazione se il file di log è vuoto.
- create 0640 www-data adm – creare un nuovo file di log vuoto con i permessi, il proprietario e il gruppo specificati. Il proprietario dovrebbe corrispondere all'utente sotto cui l'applicazione viene eseguita (nei sistemi basati su Debian spesso
www-data, nei sistemi basati su RHEL solitamenteapacheonginx). - sharedscripts – eseguire lo script postrotate una volta, anche se sono stati abbinati più file.
- postrotate – segnalare all'applicazione di riaprire i suoi handle di file dopo la rotazione.
Se la directory /opt/myapp/ o i file di log non esistono ancora al momento della prima esecuzione, non è un problema. La direttiva missingok farà sì che logrotate salti silenziosamente il file senza generare un errore. La rotazione dei log inizierà automaticamente non appena l'applicazione creerà i log.
Passaggio 4: Testare la configurazione
4.1 Esecuzione di prova
Dopo aver scritto la configurazione, dovrebbe essere verificata. Il flag -d esegue logrotate in modalità debug – nulla viene effettivamente modificato:
sudo logrotate -d /etc/logrotate.d/myapp
La modalità -d produce informazioni diagnostiche ma non modifica alcun file.
4.2 Esecuzione reale forzata
Se l'esecuzione di prova sembra corretta – forza una rotazione effettiva usando il flag -f:
sudo logrotate -f /etc/logrotate.d/myapp
Importante: Il flag -f attiva una rotazione effettiva. Eseguilo solo dopo che l'esecuzione di prova sembra corretta.
Passaggio 5: Verificare il risultato
Dopo le prime rotazioni, controlla la directory dei log:
ls -lh /opt/myapp/
Output previsto:
total 28K -rw-r----- 1 www-data adm 0 Jan 17 12:00 app.log -rw-r----- 1 www-data adm 12K Jan 17 11:59 app.log.1 -rw-r----- 1 www-data adm 11K Jan 16 12:00 app.log.2.gz -rw-r----- 1 www-data adm 9K Jan 15 12:00 app.log.3.gz
La rotazione più recente (app.log.1) rimane non compressa a causa di delaycompress. Tutto ciò che è più vecchio è compresso con gzip. Questo è esattamente ciò che volevamo.
Passaggio 6: Verificare la pianificazione automatica
logrotate viene eseguito automaticamente – tramite cron o un timer systemd, a seconda della distribuzione.
Sistemi basati su Cron
cat /etc/cron.daily/logrotate
Se il file esiste – è il file che esegue logrotate giornalmente.
Sistemi basati su Systemd
Nei sistemi più recenti, logrotate può essere eseguito tramite un timer systemd invece di cron.
Controlla:
systemctl list-timers | grep logrotate
Dovresti vedere un timer con gli orari dell'ultima e della prossima esecuzione, qualcosa come:
Thu 2026-01-18 00:00:00 UTC 23h left Wed 2026-01-17 00:00:11 UTC 47 min ago logrotate.timer
Se logrotate.timer manca dall'output – il timer è disabilitato. Abilitalo:
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
File di stato
Puoi controllare quando logrotate è stato eseguito l'ultima volta tramite il suo file di stato:
cat /var/lib/logrotate/status
Questa è la cronologia delle rotazioni di logrotate. Dopo la prima esecuzione reale, vedrai ogni file di log con la data della sua ultima rotazione:
"/opt/myapp/app.log" 2026-1-17 "/var/log/nginx/access.log" 2026-1-17
Se un log non viene ruotato quando previsto – questo è il primo posto da controllare.
Rollback
Per annullare tutto ciò che è stato fatto, elimina semplicemente il file di configurazione da /etc/logrotate.d/:
sudo rm /etc/logrotate.d/myapp
Questo interromperà l'elaborazione dei log per la tua applicazione. I file già ruotati non vengono eliminati.
Per rimuovere completamente logrotate:
Debian/Ubuntu:
sudo apt remove logrotate
CentOS/RHEL:
sudo yum remove logrotate
Importante: Rimuovere logrotate disabiliterà la rotazione dei log per l'intero sistema, inclusi nginx, rsyslog e altri servizi che ne dipendono.
Conclusione
Questo è tutto. Un file ben scritto in /etc/logrotate.d/, verificato con -d – ed è fatto. I log rimangono puliti, il disco rimane sano e non devi più pensarci.
Versione del documento: 1.2
Ultimo aggiornamento: Marzo 2026
Proprietario: Team di Documentazione Tecnica