GoAccess
Goaccess (https://goaccess.io/) è un analizzatore di log di Apache (e anche Nginx e non solo) scritto in C, veloce e abbastanza flessibile. Qui mi limiterò a tenere un paio di appunti su come l'ho installato e configurato io per un cliente, ci sono sicuramente tante funzionalità che qui non prendo in considerazione che vale la pena di analizzare andando sul sito di Goaccess stesso.
Installazione
Io ho installato il pacchetto, presente in Debian e derivati, semplicemente con
apt install goaccess
Lancio in command line
Goaccess può essere lanciato in command line e ha un output testuale, è sufficiente dirgli che log vuoi analizzare e in che formato deve leggerlo. Per Apache, con il formato "combined" che è quello che uso normalmente, e` sufficiente una cosa tipo:
goaccess /var/log/apache2/access.log --log-format=COMBINED
Se vogliamo leggere più di un log, e per esempio i vecchi log sono gzippati (come è default) allora dobbiamo fare una cosa tipo:
zcat /var/log/apache2/access*.gz | goaccess --log-format=COMBINED
Notare che questo sistema non legge i files non gzippati (cioe` gli ultimi due log) in quanto zcat è idiota e se il file in input non è gzippato invece di fare il cat semplice, riporta errore. C'è un trucco orrendo per leggere i log compressi e non compressi, che è` questo:
zcat /var/log/apache2/access*.gz | goaccess - /var/log/apache2/access.log.1 /var/log/apache2/access.log --log-format=COMBINED
Output su file HMTL
Volendo, posso aggiungere alla command line precendete un semplice -o nomefile.html per salvare su un file html un bel report grafico.
Generare automaticamente i report ogni giorno con memoria storica dei dati
Se vogliamo tenere le statistiche di un sito in modo continuativo possiamo dire a goaccess di salvare i dati pregressi e aggiungere quelli nuovi. Un sistema per farlo, un pelo complesso, e` il seguente.
Creiamo una directory dove teniamo i dati storici di Goaccess, nel suo formato interno. Per questo esempio uso /var/spool/goaccess/NOMESITO:
mkdir /var/spool/goaccess mkdir /var/spool/goaccess/NOMESITO
- Eseguiamo a mano Goaccess per parsare tutti i log vecchi che abbiamo, per la prima volta, creando i database interni che useremo in seguito (e anche un report html che mettiamo in un posto dove è accessibile dal web server)
zcat /var/log/apache2/access*.gz | goaccess --log-format=COMBINED -a --persist --db-path /var/spool/goaccess/NOMESITO -o /var/www/NOMESITO/report.html
- Eseguiamo a mano Goaccess per parsare il log non gzippato di ieri (access.log.1) che non è compreso fra quelli che ho parsato prima, avendo cura di dirgli di aggiungere i dati dal database
cat /var/log/apache2/access.log.1 | goaccess --log-format=COMBINED -a --restore --persist --db-path /var/spool/goaccess/NOMESITO -o /var/www/NOMESITO/report.html
- Mettiamo in cron Goaccess in modo che giri ogni notte dopo il logrotate di Apache, e processi solo il log.1 (cioe` il log di ieri) e non tutti gli altri, che sono gia` stati processati prima. Notare che ho verificato che logrotate di apache giri a mezzanotte, e che lancio quindi il mio cron a mezzanotte e 20). Il vostro logrotate potrebbe girare a orari diversi!
20 00 * * * root /usr/bin/goaccess /var/log/apache2/access.log.1 --log-format=COMBINED -a --no-progress --restore --persist --db-path /var/spool/goaccess/NOMESITO -o /var/www/NOMESITO/report.html 2> /dev/null
Proteggere il report
Se vogliamo proteggere il nostro file di report (report.html nel mio esempio) possiamo banalmente usare una configurazione come questa in Apache
<Location /report.html> AuthUserFile /etc/apache2/goaccess.htpasswd AuthName "Password Protected" AuthType Basic require valid-user </Location>