Come configurare la rotazione dei log con Logrotate su Ubuntu 18.04/20.04

I file di registro hanno lo scopo di conservare le informazioni sulle attività di sistema per un periodo di tempo ragionevole, ma i demoni di registrazione del sistema non forniscono alcun mezzo per controllare la dimensione dei file di registro. Se non selezionati, i file di registro possono crescere fino a consumare tutto lo spazio disponibile della partizione su cui risiedono. Per evitare che i file di registro si riempiano completamente, i messaggi di registro possono essere ruotati, il che significa che quando viene raggiunta una certa soglia, il vecchio file di registro viene chiuso e viene aperto un nuovo file di registro.
Qui ti mostrerò come ruotare i file di registro con logrotate su Ubuntu 18.04/20.04.
Che cos’è la rotazione del registro?
La rotazione dei log è un processo che risolve questi problemi archiviando periodicamente il file di log corrente e avviandone uno nuovo. Rinomina e facoltativamente comprime i file di registro correnti, elimina i vecchi file di registro e impone al sistema di registrazione di iniziare a utilizzare i nuovi file di registro. Di solito viene eseguito automaticamente cronicamente utilità. Con la rotazione del registro, puoi
- avviare un nuovo file di registro in base a una pianificazione, ad esempio giornaliera, settimanale o mensile
- comprimere i vecchi file di registro per risparmiare spazio su disco
- ritaglia i vecchi archivi in modo da conservare solo un certo numero di vecchi registri.
- rinominare i vecchi file di registro con un indicatore di data in modo da sapere dove cercare i registri meno recenti.
- eseguire i comandi prima o dopo la rotazione di una serie di registri.
È possibile visualizzare la rotazione del registro come un processo che rinomina un file di registro corrente e imposta un nuovo file di registro per le nuove voci di registro. Quando un file di registro viene ruotato, il vecchio file di registro viene in genere copiato in un file che contiene la data di rotazione.
1) File di configurazione di Logrotate
Su Ubuntu 18.04, i file di configurazione di logrotate sono /etc/logrotate.conf
insieme a tutti i file da /etc/logrotate.d
Il principale logrotate.conf file specifica tutte le impostazioni predefinite e i file di sistema da ruotare. Il file contiene alcune opzioni che sono ben spiegate dai commenti.
cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
Le principali opzioni di logrotate Siete:
- settimanalmente: ruotare i file di registro una volta alla settimana
- su root syslog: archivierà i log utilizzando l’utente specificato (radice) e gruppo (log di sistema) per evitare problemi con le autorizzazioni
- ruota 4: assicura che vengano salvate quattro versioni precedenti del file. Ruota un determinato registro quattro volte prima di eliminarlo, quindi mantiene online quattro settimane di registri.
- creare: Il vecchio file viene salvato con un nuovo nome e viene creato un nuovo file
- comprimere: compress fa sì che logrotate comprima i file di registro per risparmiare spazio. Questo viene fatto usando gzip per impostazione predefinita, ma puoi specificare un altro programma
- include: Questa importante opzione assicura che il contenuto della directory
/etc/logrotate.d
È incluso. In questa directory sono presenti file che specificano come gestire i singoli file di registro.
Ogni file in /etc/logrotate.d
viene utilizzato per aggiungere impostazioni aggiuntive o sovrascrivere le impostazioni predefinite per determinati file. La cartella contiene anche la configurazione logrotate di tutti i pacchetti installati che richiedono la rotazione dei log
# ls -l /etc/logrotate.d
total 40
-rw-r--r-- 1 root root 120 Nov 2 2017 alternatives
-rw-r--r-- 1 root root 442 Oct 23 2017 apache2
-rw-r--r-- 1 root root 126 Nov 20 16:39 apport
-rw-r--r-- 1 root root 173 Apr 20 10:08 apt
-rw-r--r-- 1 root root 112 Nov 2 2017 dpkg
-rw-r--r-- 1 root root 146 Apr 17 17:35 lxd
-rw-r--r-- 1 root root 845 Jan 12 10:57 mysql-server
-rw-r--r-- 1 root root 501 Jan 14 16:19 rsyslog
-rw-r--r-- 1 root root 178 Aug 15 2017 ufw
-rw-r--r-- 1 root root 235 Apr 17 14:53 unattended-upgrades
Puoi vedere, ad esempio, la configurazione logrotate per il server web apache
# cat /etc/logrotate.d/apache2
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if invoke-rc.d apache2 status > /dev/null 2>&1; then
invoke-rc.d apache2 reload > /dev/null 2>&1;
fi;
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate;
fi;
endscript
}
Logrotate contiene alcune opzioni aggiuntive che puoi vedere sopra:
- quotidiano: ruotare registro per giorno base
- mancante: Non generare un errore se manca il registro
- ritardocompressione: Non comprimere il file finché non è già stato ruotato. Questo serve a prevenire il danneggiamento se il demone non chiude immediatamente il file di registro.
- notificavuoto: Non ruotare il file di registro quando è vuoto
- creare adm root 640: questo creerà nuovi file di registro con autorizzazioni, proprietario e set di gruppi
- script condivisi: Se il carattere jolly corrisponde a più file, esegui qualsiasi script una volta per tutti i file
- postrotazione/endscript: Specifica alcuni comandi o script che devono essere eseguiti da sceneggiatura finale parola chiave, dopo che i registri sono stati ruotati.
- prerotazione/endscript: come postrotazione/endscriptspecifica i comandi o gli script che devono essere eseguiti prima di avviare la rotazione del log.
È possibile avere alcune informazioni sulle opzioni aggiuntive utilizzando il manuale
man logrotate
2) Configurare la rotazione dei log con logrotate
Il comando logrotate di solito rinomina (o ruota) i file di log su base ciclica; il file di registro verrà rinominato per contenere un’estensione numerica o di data e verrà creato un nuovo file di registro per accettare le informazioni di sistema. Se logrotate è configurato per conservare solo due copie dei vecchi file di registro, dopo due rotazioni del registro, il file di registro più vecchio verrà rimosso automaticamente.
Normalmente il comando logrotate è installato per impostazione predefinita su Ubuntu 18.04 e puoi controllare la versione come di seguito
# logrotate --version
logrotate 3.11.0
Per impostazione predefinita, logrotate viene eseguito quotidianamente eseguendo lo script della shell /etc/cron.daily/logrotate
Vedrai che gli altri file cron non contengono alcun file logrotate
cat /etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo ""$logfile" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
Puoi vedere cosa farebbe la configurazione logrotate dell’app se eseguita con -d
parametro di comando
# logrotate -d /etc/logrotate.d/mysql-server
reading config file /etc/logrotate.d/mysql-server
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Handling 1 logs
rotating pattern: /var/log/mysql.log /var/log/mysql/*log after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql.log
error: skipping "/var/log/mysql.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
Creating new state
considering log /var/log/mysql/error.log
Creating new state
Now: 2018-05-22 06:02
Last rotated at 2018-05-22 06:00
log does not need rotating (log has been already rotated)
Puoi configurare la rotazione dei log come utente root e come utente non root.
a) Configurare logrotation per i pacchetti server installati
Vengono creati i file di configurazione di Logrotate come utente root /etc/logrotate.d
cartella giornaliera. Ad esempio, configureremo la rotazione dei log per il supervisore dello strumento di monitoraggio. Innanzitutto, creeremo il file di rotazione dei log su cui punteremo al file di configurazione che memorizzerà i log
# vim /etc/logrotate.d/supervisor
/var/log/supervisor/superviz.log {
daily
create 0640 root root
missingok
dateext
rotate 3
size=1M
notifempty
sharedscripts
mail alain@linoxide.com
}
Spieghiamo alcune opzioni:
- dataext: usa la data come estensione per le vecchie versioni dei file di registro
- taglia: file di log che diventano più grandi della dimensione specificata qui
- Inviare: per istruire logrota a inviare via e-mail il suo contenuto all’indirizzo specificato prima di sovrascriverlo. Devi avere un server di posta funzionante
Ora possiamo testare la configurazione chiamando logrotate in modalità debug, che punta alla configurazione principale contenente la nostra cartella. Il comando visualizzerà alcune informazioni, ma le ordineremo solo in base alla nostra configurazione
# logrotate /etc/logrotate.conf --debug
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apache2
reading config file apport
reading config file apt
reading config file dpkg
reading config file lxd
reading config file mysql-server
reading config file rsyslog
reading config file supervisor
reading config file ufw
reading config file unattended-upgrades
Reading state from file: /var/lib/logrotate/status
...
...
rotating pattern: /var/log/supervisor/supervisord.log 1048576 bytes (3 rotations)
empty log files are not rotated, old logs mailed to alain@linoxide.com
switching euid to 0 and egid to 106
considering log /var/log/supervisor/supervisord.log
Creating new state
Now: 2018-05-22 08:16
Last rotated at 2018-05-22 08:00
log does not need rotating (log size is below the 'size' threshold)
switching euid to 0 and egid to 0
....
....
Puoi vedere che la nostra configurazione non ha ancora bisogno di rotazione. Questo perché la dimensione della condizione non è stata ancora verificata. Una volta che questo comando viene eseguito senza errori, significa che la configurazione sembra corretta.
b) Configurare la rotazione del registro per l’applicazione personalizzata
È possibile configurare la rotazione dei log per le applicazioni personalizzate che generano log e vengono eseguite come utente non root. Per impostazione predefinita, logrotate viene eseguito quotidianamente, quindi se è necessario eseguire la nostra applicazione ogni ora, creeremo la configurazione logrotate al di fuori della cartella predefinita.
Facciamo un esempio impostando la rotazione dei log per discord. Creeremo una cartella personale che conterrà il file di configurazione principale di logrotate e una cartella per i file di log. Questa applicazione non comprende la rotazione dei log, quindi logrotate la gestirà utilizzando un’implementazione di copia e troncamento
$ vim apps/logrotate.conf
/home/alain/apps/logs/discord.log {
hourly
copytruncate
missingok
dateext
rotate 10
compress
}
Ho usato nuove opzioni copia troncata che tronca il vecchio file di registro dopo aver creato una copia invece di spostare il vecchio file e crearne uno nuovo. Ciò è utile per i servizi a cui non è possibile indicare di chiudere i propri file di registro.
Possiamo testare la nostra configurazione, ma dobbiamo specificare un file di stato. Questo file registra ciò che logrotate ha visto e fatto l’ultima volta che è stato eseguito, quindi sa cosa fare la prossima volta che viene eseguito. Si noti che stiamo eseguendo il comando come utente non root
$ logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Handling 1 logs
rotating pattern: /home/alain/apps/logs/discord.log hourly (10 rotations)
empty log files are rotated, old logs are removed
considering log /home/alain/apps/logs/discord.log
Creating new state
Now: 2018-05-22 10:09
Last rotated at 2018-05-22 10:00
log does not need rotating (log has been already rotated)
Se provi lo stesso comando dopo alcune ore, potresti vedere alcune informazioni aggiuntive nell’output, come le informazioni di troncamento e compressione
logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Creating new state
Handling 1 logs
rotating pattern: /home/alain/apps/logs/discord.log hourly (10 rotations)
empty log files are rotated, old logs mailed to alain@linoxide.com
considering log /home/alain/apps/logs/discord.log
Now: 2018-05-22 22:52
Last rotated at 2018-05-22 10:23
log needs rotating
rotating log /home/alain/apps/logs/discord.log, log->rotateCount is 10
dateext suffix '-2018052222'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
copying /home/alain/apps/logs/discord.log to /home/alain/apps/logs/discord.log-2018052222
truncating /home/alain/apps/logs/discord.log
compressing log with: /bin/gzip
Si noti che una configurazione logrotate è definita da un file glob che corrisponde ai file di log, seguito da una serie di istruzioni racchiuse tra parentesi graffe. Se un’opzione non è specificata nella stanza aggiunta al nome del file di log, l’opzione di livello superiore from /etc/logrotate.conf
ha priorità. I file di registro che sono stati ruotati non vengono archiviati da nessuna parte; se ne sono andati, quindi dovresti considerare di agire.
Leggi anche: