Newsgroup: it.comp.os.linux.sys
Titolo: Analisi schedulata con webalizer

Salve a tutti, vi chiedo aiuto per un problema con l'analisi dei logs di 
apache con webalizer.
Ho un server apache che hosta diversi siti e i cui logs finiscono tutti 
nel classico /var/log/httpd/access.log, il mio obbiettivo è di 
schedulare dei cronjob che facciano l'analisi dei logs dei singoli siti, 
analisi che vengano pubblicate su un sito comune sotto diverse 
sottodirectory.
A oggi sono riuscito a spezzettare tramite uno script perl i logs di 
ogni sito, il risultato sono tanti file .log ciascuno con il nome nel 
formato www.sito.com.log.
E' possibile creare uno script bash che ciclando sui files presenti 
nella directory con i logs ne faccia l'analisi con webalizer e mi scriva 
l'output in directory differenti?
Grazie!!!
Tyler Durden

 
Io ho creato n file di configurazione di Webalizer che puntano a sorgenti e
destinazioni diverse. Poi invoco con cron Webalizer con parametro "-f
nomefile.conf" tante volte quanto serve.
Se però hai molti siti ti conviene fare un ciclo tipo:
for i in `seq 1 100`
do
webalizer -f /etc/webalizer/sito_$i.conf
done
Ovviamente devi preparare un file per sito (sito_1.conf, sito_2.conf...), ma
saranno più o meno tutti uguali tranne le direttive LogFile e OutPutDir.
In questo modo puoi anche personalizzare l'output per ciascun sito.
LG
-- 
Dott. Ing. Leandro Gelasi
LinuxHelp - Servizio supporto utenti Linux
Università di Roma "La Sapienza" - C.I.T.I.Co.R.D.
Email: gelasi(At)linuxhelp(punto)uniroma1(punto)it
Home Page: 
http://linuxhelp.uniroma1.it
Tel: 0649913828 - 23828 (int)

 nomefile.conf" tante volte quanto serve.
Anche io ho fatto una cosa molto simile.
Una directory per ogni sito in cui c'è il file di config e i log (prelevati 
via FTP in quanto la macchina di statistiche è una unica e fa le statistiche 
per tutti i siti sparsi nelle altre macchine), webalizer richiamato per ogni 
file di config che mette il risultato nella cartella specifica e ovviamente 
Apache con tanti virtual host quanti sono i siti per mostrare le 
statistiche.

 done
io ho fatto una cosa simile ma anzichè usare sito_NNN.log ho lasciato 
creare i log con i nomi del virtualhost quindi ho tutti i log in questo 
modo:
   /directory/che/contiene/log/nomesito.log
che mi serve per cogliere SUBITO a quale sito mi riferisco e poi con un 
ciclo
for filelog in ls /directory/che/contiene/log/*.log
     do
     webalizer -f $filelog
done
Ciao
	Mavimo

 
Anch'io ti consiglio di usare i virtualhost per avere i log dei tuoi 
siti gia' separati.
Per il resto, faccio la rotazione, li spezzo per mese e li analizzo con 
quanto segue (lungo). Una cosa carina e' 
log-splitter.pl
 (prova a 
cercarlo con google), uno script che ti spezza i log per mese. Lo trovo 
molto utile per l'archiviazione dei log.
#!/bin/bash
PATH=...
export PATH
BASE=...
LOGS=$BASE/logs
OLDLOGS=$BASE/logs/oldlogs
OUTPUTDIR=$BASE/htdocs/html/Stats
TMPDIR=$BASE/logs/tmpdir
SERVICES=$BASE/scripts/rotate_logs.txt
CONFIGFILE=/etc/webalizer.conf
SPLITLOG=$BASE/scripts/
log-splitter.pl
WEBALIZER=/usr/bin/webalizer
SED=/bin/sed
#clean tmpdir
rm -r $TMPDIR
mkdir $TMPDIR
##rotate
#for all services
#$SERVICES e' un file che contiene i nomi dei siti (uno per riga)
#mv the log to a temporary dir
for I in `$SED '/^#/d' $SERVICES`
   do
   echo "rotating $I"
   #use mv so that apache keeps on writing to the logs
   mv $LOGS/$I-access_log $TMPDIR
done
echo "logs moved"
#HUP the server (also recreate logs)
/etc/init.d/apache restart
echo "HUP sent"
#check if something went badly wrong
ps -C apache
if [ $? -ne 0 ]
     then
     ( echo "From: rotateAndStat.sh on proxy";
         echo "Subject: ERROR on proxy";
         echo "";
         echo "No Apache running on proxy."
         echo "Please manually restart apache."
         echo "";) | mail sysadmin
fi
##split
#for all services
for I in `$SED '/^#/d' $SERVICES`
   do
   echo ""
   echo ""
   echo ""
   echo ""
   echo "considering: $I"
   if [ ! -d $OLDLOGS/$I ]
       then
       mkdir $OLDLOGS/$I
   fi
#set current working directory
   cd $OLDLOGS/$I
#split the log by month
#$SPLITLOG is a nice perl script (
log-splitter.pl
) that split a log in 
#various ways
   $SPLITLOG -i monthly -b $I-access_log -l $TMPDIR/$I-access_log
   echo "splitted $TMPDIR/$I-access_log"
##analize
#find all new files (need to sort them because otherwise webalizer
#could analyze the newer before the older and fail to write statistics
#for the older when it analyzes it)
   FILESTOANALYZE=(`/usr/bin/find $OLDLOGS/$I -name $I-access_log\* \ 
-mtime -1 | sort`)
   echo "files to analyze: ${FILESTOANALYZE[@]}"
#for all files
   for F in ${FILESTOANALYZE[@]}
     do
     echo "analyzing $F:"
#get the year that have been logged; this will be useful at
#the passage from december to january
     Y=`echo $F | sed -ne 's/.*\.\([12][09][09][0-9]\)-.*/\1/p'`
     echo "year of file: $Y"
#if necessary make a subdir for the output of service and the year stats
     if [ ! -d $OUTPUTDIR/$I/$Y ]
         then
         mkdir -p $OUTPUTDIR/$I/$Y
     fi
#analize the log and output to the dir specific for the service and the 
#year
     $WEBALIZER -c $CONFIGFILE -n $I -o $OUTPUTDIR/$I/$Y -p $F
     echo "done"
   done
done