Utilizzo dei piped logs

Una interessante e flessibile funzionalitą del sistema di logging di Apache č la possibilitą di inviare i dati di un log (sia un error log che un transfer log) ad un programma, tramite una normale pipe, invece che scriverli direttamente su un file.

Il programma che riceve il log in standard input potrą processarli e scriverli in standard output secondo criteri assolutamente gestibili.
Va notato che il programma a cui si passano i log viene eseguito con i permessi di Apache, quindi di root, per cui bisogna prestare attenzione ai possibili rischi in termini di sicurezza.
Per questa funzione basta sostituire al nome del file la pipe e il nome del programma (o la command line) a cui inviare i log.
Alcuni esempi possono essere illuminanti sulle enormi possibilitą che si aprono con questa funzione:
Compressione dei log on-the-fly:
CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common
Reverse lookup sui client IP in quasi real-time, senza ritardare le risposte del server come accade con la direttiva HostNameLookup:
CustomLog "|/usr/local/apache/bin/logresolve >> /var/log/access_log" common
Esegue la rotazione automtica dei log ogni 24 ore (86400 secondi):
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" combined
Usando il tool cronolog si creano log mensili con nomi che contengono mese e anno:
CustomLog "|cronolog /var/log/apache/DOMAIN/%Y/%Y-%m-access.log" combined

Si invia il log ad un proprio programma filtro.sh:
CustomLog "|/usr/local/bin/filtro.sh" combined
In un caso simile filtro.sh deve poter ricevere in STDIN dei dati, gestirli e scriverli da qualche parte. Un esempio, che logga in un file a parte tutte le richieste generate da worm come Nimda č questo:
#!/bin/sh
NIMDA_LOG=/var/www/httpd/nimda_log
NORMAL_LOG=/var/www/httpd/access_log
STRING=cmd.exe
while /bin/true;
do
  read loginput
  if [ `echo "$loginput" | grep -c $STRING ` == 1 ]
  then
    echo "$loginput" >> $NIMDA_LOG &
  else
    echo "$loginput" >> $NORMAL_LOG &
  fi
done

Privacy Policy