Gestione dei log con Logrotate

Come configurare Logrotate per la gestione dei log di sistema e delle applicazioni.

Quando si lavora con VPS o server dedicati, tenere traccia di eventi ed errori è essenziale per il monitoraggio e la diagnostica. I file di log di grandi dimensioni creano problemi concreti: sono difficili da analizzare, consumano CPU e memoria e possono causare interruzioni delle applicazioni quando il disco si riempie.

Logrotate risolve questo problema archiviando automaticamente i log correnti e creando nuovi file per i dati in arrivo.

Verificare l'installazione

Logrotate è preinstallato sulla maggior parte delle distribuzioni Linux e viene eseguito automaticamente tramite lo scheduler cron. Per verificare la versione:

logrotate --version

Esempio di output:

logrotate 3.21.0
    Default mail command: /usr/bin/mail
    Default compress command: /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path: /var/lib/logrotate/status
    ACL support: yes
    SELinux support: yes

L'output mostra quali strumenti Logrotate utilizza per la compressione e le notifiche, insieme al percorso del file di stato che registra la cronologia delle rotazioni.

Struttura della configurazione

Logrotate utilizza una struttura di configurazione gerarchica. I parametri globali sono definiti in /etc/logrotate.conf, mentre le impostazioni per singola applicazione si trovano in /etc/logrotate.d/.

Esempio di /etc/logrotate.conf su Ubuntu:

# rotate log files weekly
weekly

# use the adm group by default
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

Parametri principali:

  • weekly — i log vengono ruotati una volta alla settimana.
  • create — dopo la rotazione viene creato un nuovo file di log vuoto.
  • rotate 4 — vengono conservate quattro copie archiviate.
  • su root adm — la rotazione viene eseguita come utente root e gruppo adm, per evitare problemi di permessi con i log di sistema.
  • compress — compressione degli archivi (disabilitata per impostazione predefinita).
  • include /etc/logrotate.d — carica i file di configurazione per singola applicazione.

Per l'elenco completo delle direttive:

man logrotate

Configurazione per applicazione

I file in /etc/logrotate.d/ seguono la stessa struttura della configurazione globale, ma si applicano solo a log specifici. Le impostazioni in questi file sovrascrivono i valori globali di /etc/logrotate.conf. Se una direttiva non è specificata nella configurazione dell'applicazione, viene utilizzato il valore globale.

Esempio di /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
}

Se /etc/logrotate.conf imposta rotate 4 e la configurazione di un'applicazione non definisce rotate, i log di quell'applicazione continueranno a conservare quattro copie archiviate.

Pianificazione della rotazione

Per impostazione predefinita, Logrotate utilizza un approccio temporale: i log vengono ruotati secondo una pianificazione fissa. Intervalli supportati: hourly, daily, weekly, monthly, yearly.

Logrotate viene in genere eseguito una volta al giorno tramite /etc/cron.daily/logrotate. Per abilitare la rotazione oraria, sposta il job in cron.hourly:

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly

Per esecuzioni ancora più frequenti, configura un cron job personalizzato.

Rotazione in base alla dimensione

Per i servizi con volumi di log imprevedibili, la rotazione può essere attivata dalla dimensione del file anziché dalla pianificazione.

size — la rotazione avviene solo quando il file raggiunge la dimensione specificata, indipendentemente dalla pianificazione:

/var/log/app/*.log {
    size 50M
}

size e le direttive temporali si escludono a vicenda — ha effetto sempre l'ultima opzione indicata. Se daily compare dopo size, i log vengono ruotati quotidianamente e la soglia di dimensione viene ignorata.

minsize — la rotazione segue la pianificazione, ma solo se il file ha raggiunto la dimensione minima:

/var/log/app/*.log {
    daily
    minsize 50M
}

maxsize — la rotazione avviene immediatamente non appena il file supera il limite di dimensione, anche se il momento pianificato non è ancora arrivato:

/var/log/app/*.log {
    daily
    maxsize 50M
}

Le dimensioni possono essere specificate in byte (predefinito), kilobyte (k), megabyte (M) o gigabyte (G).

Metodi di rotazione

Logrotate supporta due metodi principali per gestire i file di log attivi.

create (predefinito) — rinomina il file attivo (app.logapp.log.1) e crea un nuovo file vuoto con il nome originale. È il metodo consigliato e riduce al minimo il rischio di perdita dei dati di log:

/var/log/app/*.log {
    create
    # create 644 appuser group — imposta opzionalmente permessi, proprietario e gruppo
}

copytruncate — copia il contenuto del file corrente in un archivio, quindi svuota l'originale. Consente alle applicazioni di continuare a scrivere sullo stesso file descriptor. Consigliato solo per applicazioni legacy che non riescono a riaprire i file di log dopo la rotazione:

/var/log/app/*.log {
    copytruncate
}

Denominazione dei file di archivio

Per impostazione predefinita, i file ruotati ricevono numeri sequenziali: app.log.1, app.log.2 e così via. Per aggiungere timestamp, usa dateext:

/var/log/app/*.log {
    dateext
    # predefinito: -%Y%m%d per daily, -%Y%m%d%H per hourly
}

Un log ruotato il 25 giugno 2025 si chiamerà app.log-20250625.

Per i log ruotati più volte al giorno, usa un timestamp Unix per garantire l'unicità:

/var/log/app/*.log {
    dateformat -%Y%m%d-%s
}

La direttiva dateyesterday assegna al file la data del giorno precedente — utile quando la rotazione avviene dopo mezzanotte ma i dati appartengono al giorno prima.

Compressione

La direttiva compress abilita la compressione gzip:

/var/log/app/*.log {
    compress
}

Per utilizzare uno strumento di compressione diverso:

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/bzip2
    uncompresscmd /usr/bin/bunzip2
    compressext .bz2
}

delaycompress impedisce che il file ruotato più di recente venga compresso immediatamente — utile quando un'applicazione continua a scrivere sul vecchio file dopo la rotazione:

/var/log/app/*.log {
    compress
    delaycompress
}

compressoptions imposta il livello di compressione gzip da -1 (veloce, bassa compressione) a -9 (lento, compressione massima):

/var/log/app/*.log {
    compress
    compressoptions -9
}

Risoluzione dei problemi

Il file di stato di Logrotate mostra quando ogni file di log è stato ruotato l'ultima volta:

sudo cat /var/lib/logrotate/status

Per un'analisi dettagliata, esegui Logrotate in modalità debug:

sudo logrotate --debug /etc/logrotate.conf

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