Ricerca nel sito web

Come impostare e gestire la rotazione dei registri utilizzando Logrotate in Linux


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 viene scritta in un file all'interno di questa directory o in una delle sue sottodirectory.

Tali file sono conosciuti come log e sono la chiave per esaminare come funziona il sistema (e come si è comportato in passato). I registri sono anche la prima fonte di informazioni a cui gli amministratori e i tecnici guardano durante la risoluzione dei problemi.

Se guardiamo il contenuto di /var/log su CentOS/RHEL/Fedora e Debian/Ubuntu (per varietà) vedremo i seguenti file di registro e sottodirectory.

Tieni presente che il risultato potrebbe essere leggermente diverso nel tuo caso a seconda dei servizi in esecuzione sui tuoi sistemi e del tempo in cui sono stati in esecuzione.

In RHEL/CentOS e Fedora

ls /var/log

In Debian e Ubuntu

ls /var/log

In entrambi i casi, possiamo osservare che alcuni nomi di registro terminano come previsto in “log ”, mentre altri vengono rinominati utilizzando una data (ad esempio, maillog-20160822 su CentOS) o compresso (considerate auth.log.2.gz e mysql.log.1.gz su Debian forte>).

Questo non è un comportamento predefinito in base alla distribuzione scelta ma può essere modificato a piacimento utilizzando le direttive presenti nei file di configurazione, come vedremo in questo articolo.

Se i log venissero conservati per sempre, finirebbero per riempire il filesystem dove risiede /var/log. Per evitare ciò, l'amministratore di sistema può utilizzare una simpatica utility chiamata logrotate per ripulire i registri su base periodica.

In poche parole, logrotate rinominerà o comprimerà il registro principale quando viene soddisfatta una condizione (ne parleremo più avanti tra un minuto) in modo che l'evento successivo venga registrato su un file vuoto.

Inoltre, rimuoverà i “vecchi” file di registro e manterrà quelli più recenti. Naturalmente, possiamo decidere cosa significa "vecchio" e quanto spesso vogliamo che logrotate ripulisca i log per noi.

Installazione di Logrotate su Linux

Per installare logrotate, utilizza semplicemente il tuo gestore pacchetti:

---------- On Debian and Ubuntu ---------- 
aptitude update && aptitude install logrotate 

---------- On CentOS, RHEL and Fedora ---------- 
yum update && yum install logrotate

Vale la pena notare che il file di configurazione (/etc/logrotate.conf) può indicare che altre impostazioni più specifiche possono essere inserite nei singoli file .conf all'interno /etc/logrotate.d.

Questo sarà il caso se e solo se la seguente riga esiste e non è commentata:

include /etc/logrotate.d

Continueremo a mantenere questo approccio, poiché ci aiuterà a mantenere le cose in ordine, e utilizzeremo il box Debian per i seguenti esempi.

Configura Logrotate in Linux

Essendo uno strumento molto versatile, logrotate fornisce numerose direttive per aiutarci a configurare quando e come verranno ruotati i log e cosa dovrebbe accadere subito dopo.

Inseriamo il seguente contenuto in /etc/logrotate.d/apache2.conf (nota che molto probabilmente dovrai creare quel file) ed esaminiamo ogni riga per indicarne lo 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:

  • settimanale significa che lo strumento tenterà di ruotare i log su base settimanale. Altri valori possibili sono giornalieri e mensili.
  • ruota 3 indica che devono essere conservati solo 3 registri ruotati. Pertanto, il file più vecchio verrà rimosso alla quarta esecuzione successiva.
  • size=10M imposta la dimensione minima affinché la rotazione abbia luogo su 10 M. In altre parole, ogni registro non verrà ruotato finché non raggiunge i 10 MB.
  • compress e delaycompress vengono utilizzati per indicare che tutti i log ruotati, ad eccezione di quello più recente, devono essere compressi.

Eseguiamo un test per vedere cosa farebbe logrotate se venisse effettivamente eseguito ora. Utilizza 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 in base alla data in cui sono stati ruotati. Per fare ciò, utilizzeremo la direttiva dateext. Se il formato della nostra data è diverso da quello predefinito aaaammgg, possiamo specificarlo utilizzando formatodata.

Tieni presente che possiamo anche impedire che la rotazione avvenga se il log è vuoto con notifempty. Inoltre, diciamo a logrotate di inviare per posta il log ruotato all'amministratore di sistema ([email  in questo caso) come riferimento (questo richiederà la configurazione di un server di posta, che è esulano dallo scopo di questo articolo).

Se desideri ricevere e-mail su logrotate, puoi configurare il server di posta Postfix come mostrato qui: Installa il server di posta Postfix

Questa volta utilizzeremo /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 
}

Come possiamo vedere nell'immagine qui sotto, non è stato necessario ruotare questo registro. Tuttavia, quando viene soddisfatta la condizione relativa alle dimensioni (size=1M), il registro ruotato verrà rinominato access.log-25082020 (se il registro è stato ruotato agosto 25, 2020) e il log principale (access.log) verrà ricreato con i permessi di accesso impostati su 0644 e con root come proprietario e proprietario del gruppo.

Infine, quando il numero di registri raggiunge 6, il registro più vecchio verrà inviato per posta a [email .

Supponiamo ora che tu voglia eseguire un comando personalizzato quando avviene la rotazione. Per fare ciò, posiziona la riga con tale comando tra le direttive postrotate ed endscript.

Ad esempio, supponiamo di voler inviare un'e-mail a root quando uno qualsiasi dei log all'interno di /var/log/myservice viene ruotato. Aggiungiamo le righe in rosso a /etc/logrotate.d/squid.conf:

/var/log/myservice/* {
	monthly
	create 0644 root root
	rotate 5
	size=1M
    	postrotate
   		echo "A rotation just took place." | mail root
    	endscript
}

Ultimo ma non meno importante, è importante notare che le opzioni presenti in /etc/logrotate.d/*.conf sovrascrivono quelle nel file di configurazione principale in caso di conflitti.

Logrotate e Cron

Per impostazione predefinita, l'installazione di logrotate crea un file crontab all'interno di /etc/cron.daily denominato 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, controlla la riga contenente cron.daily in /etc/crontab o /etc/anacrontab.

Riepilogo

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 invierà automaticamente i registri su base periodica o quando il file raggiunge una determinata dimensione.

Assicurati solo che sia impostato per essere eseguito come processo cron e logrotate renderà le cose molto più semplici per te. Per maggiori dettagli fare riferimento alla pagina man.

Hai domande o suggerimenti su questo articolo? Sentiti libero di farcelo sapere utilizzando il modulo di commento qui sotto.