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ù vecchie
  • monthly — eseguire la rotazione una volta al mese
  • compress — comprimere i log archiviati (gzip per impostazione predefinita)
  • missingok — non generare un errore se il file di log non esiste
  • notifempty — 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 permessi 0640, di proprietà di www-data
  • sharedscripts — eseguire lo script postrotate una sola volta dopo che tutti i file corrispondenti sono stati elaborati, anziché una volta per file
  • postrotate ... 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

Hosting WebServizi di hosting affidabili per siti web di qualsiasi dimensione.
Ordina
VPSInfrastruttura cloud flessibile con accesso root completo.
Ordina
Server DedicatiServer dedicati per le massime prestazioni.
Ordina

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

--verbose stampa un resoconto dettagliato di tutto ciò che logrotate esegue. --force forza la rotazione indipendentemente dal fatto che sia dovuta o meno. --state indica 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!

Hai bisogno di aiuto?I nostri ingegneri ti aiuteranno gratuitamente con qualsiasi domanda in pochi minutiContattaci