I log sono ottimi per scoprire cosa sta facendo un'applicazione o per risolvere un possibile problema. Quasi tutte le applicazioni con cui ci occupiamo generano registri e vogliamo che anche le applicazioni che sviluppiamo noi stessi li generino. Più i log sono dettagliati, più informazioni abbiamo. Ma lasciati a se stessi, i tronchi possono crescere fino a raggiungere dimensioni ingestibili e possono, a loro volta, diventare un problema tutto loro. Quindi è una buona idea tenerli ridotti, mantenere quelli di cui avremo bisogno e archiviare il resto.
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Nozioni di base
Il logrotate
l'utilità è eccellente nella gestione dei registri. Può ruotarli, comprimerli, inviarli via e-mail, eliminarli, archiviarli e avviarne di nuovi quando ne hai bisogno.
Esecuzione di logrotate
è piuttosto semplice:basta eseguire logrotate -vs state-file config-file
. Nel comando precedente, il v
l'opzione abilita la modalità dettagliata, s
specifica un file di stato e il config-file
finale menziona il file di configurazione, dove specifichi cosa devi fare.
Hands-on
Diamo un'occhiata a un logrotate
configurazione che viene eseguita silenziosamente sul nostro sistema, gestendo la ricchezza di log che troviamo nel /var/log
directory. Controlla i file correnti in quella directory. Vedi molti *.[number].gz
File? Ecco cosa logrotate
sta facendo. Puoi trovare il file di configurazione per questo in /etc/logrotate.d/rsyslog
. Il mio si presenta così:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Il file inizia con la definizione delle istruzioni per ruotare il /var/log/syslog
file e le istruzioni sono contenute tra parentesi graffe che seguono. Ecco cosa significano:
rotate 7
:Conserva i registri delle ultime sette rotazioni. Quindi inizia a eliminarli.daily
:ruota il registro ogni giorno. Insieme arotate 7
, ciò significherebbe che i registri verrebbero conservati per gli ultimi sette giorni. Altre opzioni sonoweekly
,monthly
,yearly
. C'è anche unasize
parametro che ruoterà i file di registro se la loro dimensione aumenta oltre un limite specificato, ad esempiosize 10k
,size 10M
,size 10G
, ecc. Se non viene specificato nulla, i log verranno ruotati ogni volta chelogrotate
corre. Puoi persino eseguirelogrotate
in uncron
per utilizzarlo a intervalli di tempo più specifici.missingok
:Va bene se manca il file di registro. Niente panico.notifempty
:non ruotare se il file di registro è vuoto.delaycompress
:Se la compressione è attiva, ritarda la compressione fino alla rotazione successiva. Ciò consente la presenza di almeno un file ruotato ma non compresso. Utile se si desidera che i registri di ieri non vengano compressi per la risoluzione dei problemi. È anche utile se qualche programma potrebbe ancora scrivere sul vecchio file finché non viene riavviato/ricaricato, come Apache.compress
:La compressione è attiva. Usanocompress
per spegnerlo.postrotate/endscript
:esegui lo script all'interno di questa sezione dopo la rotazione. Utile per la pulizia. C'è anche unprerotate/endscript
per fare le cose prima che inizi la rotazione.
Riesci a capire cosa fa la prossima sezione per tutti quei file menzionati nella configurazione sopra? L'unico parametro aggiuntivo nella seconda sezione è sharedscripts
, che indica logrotate
per non eseguire la sezione all'interno di postrotate/endscript
fino al completamento di tutta la rotazione del registro. Impedisce l'esecuzione dello script per ogni registro ruotato e viene eseguito una volta alla fine.
Qualcosa di nuovo
Sto usando la seguente configurazione per gestire l'accesso Nginx e i registri degli errori sul mio sistema.
/var/log/nginx/access.log
/var/log/nginx/error.log {
size 1
missingok
notifempty
create 544 www-data adm
rotate 30
compress
delaycompress
dateext
dateformat -%Y-%m-%d-%s
sharedscripts
extension .log
postrotate
service nginx reload
endscript
}
Lo script sopra può essere eseguito utilizzando:
logrotate -vs state-file /tmp/logrotate
L'esecuzione del comando per la prima volta fornisce questo output:
reading config file /tmp/logrotate
extension is now .log
Handling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508250'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Ed eseguirlo una seconda volta:
reading config file /tmp/logrotate
extension is now .log
Handling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508280'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Ed eseguirlo una terza volta:
reading config file /tmp/logrotate
extension is now .log
Handling 1 logs
rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log 1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
log needs rotating
considering log /var/log/nginx/error.log
log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508316'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx
Il contenuto del file di stato è simile al seguente:
logrotate state -- version 2
"/var/log/nginx/error.log" 2021-08-27-9:0:0
"/var/log/nginx/access.log" 2021-08-27-9:11:56
Scarica il cheat sheet di Linux logrotate.
Questo articolo è stato originariamente pubblicato sul blog personale dell'autore ed è stato adattato previa autorizzazione.