Home Page

Tips page
c
cellulari
debian
egittologia
emacs
emacs-latex
hardware
html
inglese
java
latex
linux

*Alcuni comandi utili utilizzando find
*ARP e MAC address
*Ascoltare un CD audio
*Attivare il NumLock (BlocNum)
*Attivare i tasti i tasti Magic SysRq
*AWK, use an environment variable inside a script
*Bash e Argument list too long
*BogoMIPS
*Cancellare file e non recuperare spazio
*Capacita` dell'hard disk
*Come cambiare i font delle applicazioni con librerie GTK
*Come cambiare l'hostname
*Come tentare di recuperare file, filesystem e partizioni
*Compilare in parallelo
*Condividere una partizione
*Configure proxy for shells
*Continuous disk access
*Controllare la salute di hard disk e filesystem
*Convertire ext2 in ext3 (e viceversa)
*Convertire un file di testo dalla codifica DOS a quella UNIX
*Cosa fare quando si perde la password di root
*Cosa significa l'errore ``TCP
*Creare un boot floppy
*Creare un file temporaneo
*Deframmentazione di un filesystem
*Delete last chars from a string
*Determinare lo spazio libero sul disco
*Eliminare il beep
*Emettere un beep da script
*Enable PPP connection on boot
*Exclude a directory with rsync
*Execute telnet from a script
*Gestione dei file di log
*Gestione dei file .iso
*Gestione della data/ora
*Gestione di utenti e gruppi
*Hash md5 di una stringa
*Identificare la distribuzione installata
*I file ps e pdf
*Il file /etc/fstab
*Il file /etc/issue[.net] e /etc/motd
*Il filesystem SysFs
*I link soft ed hard
*Il path delle applicazioni
*Il sistema tutto in maiuscolo
*I moduli del kernel
*Impostare piu` IP per una scheda di rete
*Introduzione a LVM
*Inviare messaggi agli altri utenti
*I permessi della directory root, /
*La gerarchia del filesystem di Linux
*La memoria Ram sotto Linux
*La memoria swap
*Limitare la possibilita` di diventare root
*Limitazioni alla dimensione del file
*Log dei login utente
*Modificare il comportamento di ctrl+alt+canc
*Modificare le variabili della parent shell
*Montare o rimontare un filesystem come read-only
*More columns in a shell output
*Negare il login durante la manutenzione del sistema
*NoHUP
*Obtain the exact process start time
*Ottenere uno snapshot dello schermo
*Partizionamento di un sistema Linux
*Perche' si usa ./ per avviare alcuni eseguibili
*Permanent PPP connection
*PID of a process
*Programmare l'esecuzione dei programmi
*Quale processo utilizza un certo file o porta
*Quali vantaggi si hanno dalla ricompilazione
*Remove from find results
*Ricreare velocemente /tmp al boot
*Ridirezione dell'output
*Rimappare la tastiera
*Ripristinare i caratteri sballati in console
*Riscrivere l'MBR
*Salvarsi da un ``rm'' di troppo...
*Save MBR
*Scrivere in modo sincrono su filesystem
*Scrivere nel log di sistema di Linux
*Separazione dei comandi nella shell
*Separazione delle parole nella shell
*Share the internet connection
*Shell configuration files
*Single quote character escape with sed
*Spostare una directory in un'altra partizione
*Stimare il carico di lavoro della macchina
*Undelete di un file
*Usare le pendrive USB sotto Linux
*Usare partizioni primarie o estese
*Use md5sum to verify saved files
*Use ssh and scp without password
*Utilizzare hdparm per controllare gli hard disk
*Verificare un file video
*What is a zombie process
*What is the file System.map?
*What is the shebang? (Shell scripts)
*What shared libraries a program uses
*Yesterday date

matlab
misc
mysql
network
octave
programming
python
security
sed
tech
webapps
windows

University Page

Programming

Debian & Linux

Some works

About me

Del.icio.us Bookmarks

BOINC Combined Statistics

Site Statistics

Contact me sending an e-mail (antispam defense activated)

debian

hacker emblem

blogger

GeoURL

View Sandro Tosi's profile on LinkedIn

This is my Google PageRank

Title: Gestione dei file di log
Author: Sandro Tosi
Last modified: 2007-05-27


Verranno qui presentati alcuni tool o tecniche per gestire i file di log.


syslog, il log di sistema (anche in remoto)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

syslog e`  lo strumento principale di  raccolta e scrittura  log su un
sistema Linux.

Il  suo   file  di  configurazione  e`  /etc/syslog.conf   ,  e  molte
informazioni sono disponibili nelle manpage relative:

man 3 syslogd
man 8 syslogd (equivalente a man 8 syslogd)
man 5 syslog.conf

syslog  puo`  riceve messaggi  sia  tramite  ``logger'',  un tool  per
inviare  messaggi a syslog  (tramite Unix  socket, spesso  presente in
/dev/log),  oppure tramite  network  socket; quest'ultima  possibilita`
consente di creare un log server.

Per  fare cio`,  si installa  una macchina  (dedicata  sarebbe meglio,
soprattutto in funzione  del numero di nodi che  loggeranno li` sopra)
con syslog configurato per ricevere  i log via socket (quindi avviando
il deamon con l'opzione  -r ``...receive message from the network...')
che fungera`  da log  server. Lato client,  la configurazione  e` come
segue (operando su /etc/syslog.conf):

<facility>.*    @<logserver_ip>

per ogni facility che si vuole loggare sul logserver. Ulteriori e piu`
approfonditi  dettagli sono disponibili  nella manpage,  nella sezione
``SUPPORT FOR REMOTE LOGGING''

Un consiglio,  soprattutto se  i client sono  su internet:  cifrate la
connessione.

Per facilitare  questa operazione, ed  in quanto molto piu`  evoluto e
flessibile, e` vivamente consigliato installare syslog-ng e cifrare le
comunicazioni con  stunnel (che  tunnellizza e wrappa  in ssl  un solo
endpoint TCP, una  porta per intendersi). Al posto  di stunnel si puo`
anche instaurare  una vpn con  openvpn, tra client e  server. Inoltre,
con  syslog-ng,  si evita  di  esporre  su  internet (se  c'e`  questa
necessita`) un servizio che gira con i permessi di root.


Liberare spazio cancellando i log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Quando si  ha carenza di spazio sul  disco, la prima cosa  che si puo`
"sacrificare" sono i file di  log. E` importante fare attenzione a NON
cancellare un file ancora in uso da un processo.

Linux rilascia lo  spazio su disco solo quando tutti i  link e tutti i
file-descriptor  ad  un  certo  blocco  sono 0.  Se  un  processo  sta
scrivendo in  un file di  log, allora avra` un  file-descriptor aperto
verso quel logfile; effettuando

$ rm logfile

quello che si ottiene e` la cancellazione della entry nell'inode della
directory corrente,  ma in  realta` i blocchi  (e quindi lo  spazio su
disco) sono ancora in uso.

Per recupera lo spazio, e` quindi molto meglio eseguire

$ > logfile

che  redirige la  stringa vuota  su logfile,  di fatto  azzerandone la
dimensione.  Se  il  processo  resetta i  file-descriptor  ai  logfile
tramite l'invio di  SIGHUP (come syslog o apache,  per esempio) allora
si puo` anche eseguire

# rm -f /var/log/messages && touch /var/log/messages && \
    kill -SIGHUP `cat /var/run/syslogd.pid`

Se si effettua  il mv del file di log, il  processo scrivera` nel file
``spostato'', perche' in realta` punta agli stessi inode.

Una soluzione un po` piu` ``elegante'' a questo problema e` l'utilizzo
di logrotate per gestire i logfile.


logrotate per tenere sotto controllo la dimensione
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

logrotate  e` in  grado  di ``ruotare''  i  log per  dimensioni o  per
``eta`''; e`  anche in  grado di comprimere  i file in  automatico e/o
eseguire apposite funzioni prima o dopo la rotazione.

Tipicamente logrotate  applica un semplice meccanismo  di rotazione ai
log per cui:

- rinomina  il file corrente  applicando una  numerazione progressiva,
  per cui  app.log diventa  app.0 e poi  app.1.gz, app.2.gz  ecc. (dal
  momento che spesso viene compresso con gzip)
- si riparte con un  nuovo logfile fino al successivo tempo/dimensione
  di rotazione (definito in logrotate.conf)

Per   configurare    logrotate   ci   sono   due    posti:   il   file
/etc/logrotate.conf o la  directory /etc/logrotate.d/ . All'interno di
/etc/logrotate.conf ci  sono parametri generici  che vengono applicati
nel caso  in cui non  siano specificati parametri particolari.  I file
nella  directory  /etc/logrotate.d/  sono  regole  aggiuntive  per  le
applicazioni  che  hanno  necessita`  di  ruotare i  propri  log.  Per
aggiungere  una regola  di  rotazione, prendete  come  esempio una  di
quelle gia` presenti.

logrotate  e`  spesso eseguito  da  cron:  per  sapere l'orario  della
schedulazione, controllare crontab -l  -u root, /etc/crontab e/o nelle
directory  /etc/cron.daily.   Se  la  macchina non  e`  accesa  quando
dovrebbero girare gli  script di logrotate, allora i  log non verranno
ruotati; conviene  quindi utilizzare anacron (tipica  situazione per i
portatili).


analisi e monitoring dei log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Spesso nei  log possono venir  registrati molti eventi,  e solitamente
non  siamo interessati  a  tutti  essi, ma  solo  a quelli  "anomali";
l'utilizzo di tool di analisi dei log diventa quindi molto comodo.

Per i file  di log di sistema, o comunque log  in generale (per quanti
consentono customizzazioni), possiamo utilizzare i seguenti tool:

- logwatch
  ogni  mattina  invia  un  report  dei messaggi  di  log  del  giorno
  precedente; e` customizzabile per applicazione e verbosita`

- swatch
  un analizzatore  real-time dei log che  invia alert in  base a certi
  filtri preimpostati per condizioni particolari

- logcheck

- colorize <http://colorize.raszi.hu/>
  piu` che un  analizzatore e` un tool per colorare il  log in modo da
  migliorarne la leggibilita`


In particolare per Apache, abbiamo diversi tool specifici:

- webalizer <http://www.mrunix.net/webalizer/>
  Molto bello esteticamente, veloce e facile.

- analog <http://www.analog.cx/>
  un po' piu` spartano di webalizer

- awstats <http://awstats.sourceforge.net/>
  Conviene  disabilitare  la  possibilita`  di  aggiornamento  online,
  altrimenti si  sovraccarica la  macchina con continue  esecuzioni in
  automatico

- modlogan <http://jan.kneschke.de/projects/modlogan/>


Scrivere (o evitare) i log su una console
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Oltre ai gia`  visti strumenti di analisi e  reporting dei log, alcuni
amministratori di  sistema decidono di  stampare i messaggi di  log su
una console o su un terminale.

La soluzione piu` semplice e`:

# tail -f /var/log/kern.log
# tail -f /var/log/messages

ma  questo richiede  di avere  una sessione  aperta  (tipicamente come
root). Allora si puo` ridirigere i messaggi su un terminale virtuale:

# tail -f /var/log/syslog > /dev/tty12 &

(in questo caso il 12esimo), ma anche qui abbiamo il problema di avere
permessi amministrativi  (per poter leggere  i logfile) e di  avere un
terminale aperto con un utente admin loggato.

In realta`,  la soluzione piu`  elegante e` sfruttare le  capacita` di
syslog   (o   syslog-ng).   Per   esempio   si   puo`   aggiungere   a
/etc/syslog.conf una entry come la seguente:

# I like to have messages displayed on the console, but only on a
# virtual console I usually leave idle.
#
daemon,mail.*;\
	news.=crit;news.=err;news.=notice;\
	*.=debug;*.=info;\
	*.=notice;*.=warn	/dev/tty12

dove  al posto  di /dev/tty12  si puo`  mettere una  console  a scelta
(magari non una di login...). Per syslog-ng si puo` usare la sintassi:

source local { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };
destination tty12 { file("/dev/tty12" template("$FULLDATE $HOST $FACILITY.$PRIORITY $MSG\n") ); };
log { source(local); destination(tty12); };

Un altro utile tool per tenere sotto controllo i log e` ``root-tail'',
che  mette i  log  sullo sfondo  del  desktop; l'unica  cosa e`  stare
attenti agli  ambienti grafici, come  kde o Gnome, che  ``disegnano il
desktop'':  in  questo  caso   root-tail  non  funzionera`  in  quanto
l'ambiente grafico ``ridisegna'' il desktop sovrascrivendo root-tail.

Esiste, pero`, anche il problema  opposto: evitare che dei messaggi di
log finiscano  nei terminali/console (quanto e`  fastidioso editare un
file  con vi  e ricevere  questi  messaggi...). Molto  dipende da  che
sorgente sono generati questi messaggi;  un primo punto dove andare ad
agire e` /etc/init.d/klog mettendo

KLOGD="-c 4"

in  modo da  forzare klogd  (il daemon  che raccoglie  i  messaggi del
kernel) a  stampare i messaggi con  priorita` <= 4;  le priorita` sono
valori compresi tra 0 e  7, con un decrescente valore di criticalita`,
come indicato in /usr/include/linux/kernel.h:

[...]
#define KERN_EMERG      "<0>"   /* system is unusable                  */
#define KERN_ALERT      "<1>"   /* action must be taken immediately    */
#define KERN_CRIT       "<2>"   /* critical conditions                 */
#define KERN_ERR        "<3>"   /* error conditions                    */
#define KERN_WARNING    "<4>"   /* warning conditions                  */
#define KERN_NOTICE     "<5>"   /* normal but significant condition    */
#define KERN_INFO       "<6>"   /* informational                       */
#define KERN_DEBUG      "<7>"   /* debug-level messages                */
[...]