Log e gestione degli eventi

Loris Tissino

29 giugno 2009

Tipi di log

Su una macchina Linux sono presenti diversi tipi di file di log:

Dmesg

I messaggi diagnostici del kernel, emessi all'avvio e in occasione di particolari operazioni hardware (ad esempio, quando viene collegata una nuova periferica USB), possono essere visualizzati con il comando dmesg.

$ dmesg | head -5
[    0.000000] Linux version 2.6.22-14-generic (buildd@terranova) (gcc version 4.1.3 20070929 (prerelease) (Ubuntu
 4.1.2-16ubuntu2)) #1 SMP Tue Feb 12 07:42:25 UTC 2008 (Ubuntu 2.6.22-14.52-generic)
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
[    0.000000]  BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e4000 - 0000000000100000 (reserved)

Dove sono i file di log

Il file di log di default è /var/log/messages.

In generale, i file di log sono mantenuti tutti nella directory /var/log.

Organizzazione in facility

Le operazioni di cui prendere nota sono organizzate in diverse facility, corrispondenti ad alcune operazioni di base e tradizionali.

Le facility definite sono le seguenti:

Sono inoltre previste le facility da local0 a local7, che possono essere usati per scopi particolari.

Priorità delle registrazioni di log

Le registrazioni effettuate nei file di log sono associate ad uno dei seguenti livelli di priorità:

Configurazione delle attività di log

Il file /etc/syslog.conf contiene l'indicazione di dove registrare i messaggi di una determinata facility con una particolare priorità.

Ad esempio, righe di questo genere

daemon.*            -/var/log/daemon.log
kern.*          -/var/log/kern.log

indicano che i messaggi relativi alle facility daemon e kernel, di qualsiasi priorità (ad eccezione del livello debug) devono essere registrate nei file indicati (il segno - indica che non deve essere fatto il sync dopo ogni operazione di scrittura).

Oltre che su file, le registrazioni di log possono essere mandate ad un terminale, ad un'altra macchina, a una lista di utenti collegati ecc. In proposito, si veda syslog.conf(5).

Logger

Con il programma logger si possono registrare operazioni per una determinata facility/priorità.

Ad esempio:

$ logger -p local0.notice aggiornato orologio di sistema
$ tail -1 /var/log/messages
Mar 30 22:33:06 localhost loris: aggiornato orologio di sistema

xconsole

Da una sessione grafica, è possibile monitorare le registrazioni di log tramite xconsole, tramite il comando xconsole -file /dev/xconsole &.

Si può determinare quali registrazioni far comparire sull'xconsole impostando il file /etc/syslog.conf con |/dev/xconsole per le facility/priorità desiderate.

Lastlog

Può essere utile sapere quando è stato fatto l'ultimo login da un determinato utente. Quest'informazione si può ottenere con il comando lastlog.

$ lastlog --user loris
Nome utente      Porta    Da               Ultimo accesso
loris            tty1                      dom mar 30 22:39:19 +0200 2008
$ lastlog --user dino
Nome utente      Porta    Da               Ultimo accesso
alice            pts/4    07ud-w-l07-003.d mar mar 25 14:59:28 +0100 2008

Si veda lastlog(8) per ulteriori informazioni.

Rotazione dei file di log

La rotazione/compressione dei file di log è affidata al programma logrotate, invocato da cron a scadenze regolari e configurato tramite il file /etc/logrotate.conf (e i file della directory /etc/logrotate.d per i log delle applicazioni).

Si veda lastlog(8) per ulteriori informazioni.

Reazione ad eventi

Potrebbe essere utile avviare uno script o, in generale, compiere una determinata azione, quando si verifica un determinato evento registrato in un file di log. Una strategia possibile è quella di usare il programma inotifywait, come nel seguente esempio:

#!/bin/sh
while inotifywait -e modify /var/log/messages; do
   if tail -n1 /var/log/messages | grep httpd; then
      gdialog --msgbox "Apache needs love!"
   fi
done

File di log delle applicazioni

Molte applicazioni server registrano i propri log in directory separate. Ad esempio: