GoAccess est un utilitaire pour machines Unix d'analyse de logs de serveurs Web en temps réel.
Un des nombreux avantages de GoAccess est qu'il parse de nombreux formats de log :
Ainsi, que vous ayez un serveur Web Apache ou Nginx, vous pouvez utiliser GoAccess pour parser vos fichiers logs.
GoAccess vous affichera dans un terminal, en temps réel :
Vous avez la possibilité d'exporter le résultat en HTML, JSON, CSV. D'ailleurs, le rapport HTML est plutôt bien foutu. Cf : bas de page.
Les prérequis :
apt install libncursesw5-dev libmaxminddb-dev awk gawk gcc
L’installation se fait à partir des sources du logiciel. Il est possible de le faire à partir d’un dépôt mais dans ce cas, vous ne pourrez pas géo-localiser vos visiteurs.
On va télécharger l'archive :
wget https://tar.goaccess.io/goaccess-1.3.tar.gz # Pour la décompresser tar -xzvf goaccess-1.3.tar.gz
Puis on l'installe :
cd goaccess-1.3/ ./configure --enable-utf8 --enable-geoip=mmdb make make install
Decommenter les lignes suivante dans goaccess.conf
vi /usr/local/etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^ [%d:%t %^] "%r" %s %b %R %u
Liste des adresses IP à ne pas comptabiliser
Dans vos statistiques, vous ne voulez sûrement pas compter vos propres visites. Pour cela vous allez créer un fichier où sur chaque ligne vous indiquerez les adresses IP que GoAccess doit ignorer, par exemple celle de votre bureau, de votre maison…
vi /usr/local/etc/goaccess/ip_exclues_goaccess.conf 127.0.0.1 XXX.XXX.XXX.XXX
La base de données des localisations des adresses IP
Afin de localiser vos visiteurs, vous allez vous appuyer sur la base de donnée libre de Maxmind.com. Créez le répertoire et vous vous y déplacez :
mkdir /usr/local/etc/goaccess/GeoIP cd /usr/local/etc/goaccess/GeoIP
Téléchargez la base de donnée :
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
Téléchargez la somme md5 pour vérifier l’intégrité du fichier :
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz.md5
Puis générez la somme md5
md5sum GeoLite2-City.tar.gz
Copiez le résultat puis ouvrez avec vi la somme que vous avez téléchargée :
vi GeoLite2-City.tar.gz.md5
Sur la seconde ligne copiez le résultat et vérifiez qu’ils sont identiques. Si c’est le cas vous pouvez passer à l’étape suivante. Sinon, vous devez refaire le téléchargement de la base de donnée, votre fichier a été corrompu.
Vous décompressez l’archive dans le répertoire courant /usr/local/etc/goaccess/GeoIP
tar -xzvf GeoLite2-City.tar.gz --strip=1
Et vous la supprimez :
rm GeoLite2-City.tar.gz
Un petit script qui automatise tout ça :
vi MajGeoIP.sh #/bin/bash cd /usr/local/etc/goaccess/GeoIP rm md5sum.txt rm GeoLite2-City.tar.gz rm GeoLite2-City.tar.gz.md5 wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz.md5 # Creation md5sum de la base de données GeoLite2. md5sum < GeoLite2-City.tar.gz > md5sum.txt # Un peu de nettoyage sed -i 's/ .*//' md5sum.txt sed -i 's/$/\d10/' GeoLite2-City.tar.gz.md5 file1="md5sum.txt" file2="GeoLite2-City.tar.gz.md5" # comparez! if ! cmp --silent "$file1" "$file2"; then mail -s "Resultats de la mise a jour de GeoLites" user@email.com <<< "md5sum for GeoLite2-City failed. Please check the md5sum. File may possibly be corrupted." else tar -xzvf GeoLite2-City.tar.gz --strip=1 mail -s "Resultats de la mise a jour de GeoLites" user@email.com <<< "Votre base de données GeoLite2-City a bien ete mise a jour." fi
Vous enregistrez puis vous le rendez exécutable :
chmod +x MajGeoIP.sh
Un petit tour dans le crontab pour rajouter la ligne qui va exécuter le script le premier mercredi de chaque mois à 4h00 du matin. Maxmind met à jour sa base de données libre le premier mardi de chaque mois.
crontab -e
# Mise à jour de la base de données GeoLite2 de maxmind
0 04 1-7 * * [ "$(date '+\%a')" = "Wed" ] && /usr/local/etc/goaccess/GeoIP/MajGeoIP.sh
Ben oui, c’est quand même l’objectif de l’article !
zcat -f /var/log/nginx/access.log* | grep -v -f /usr/local/etc/goaccess/ip_exclues_goaccess.conf | goaccess -p /usr/local/etc/goaccess/goaccess.conf -a --geoip-database /usr/local/etc/goaccess/GeoIP/GeoLite2-City.mmdb --ignore-crawlers -o /var/www/html/monsupersite.fr/rapport.html
Cette ligne de code ne doit pas vous effrayer. zcat va lire vos fichiers de log, grep va faire un tri dans ce que vient de lire zcat pour exclure les adresses IP que vous ne voulez pas prendre en compte et finalement goaccess va générer les statistiques, ici en ignorant les robots de recherche.
Votre rapport est maintenant visible à monsupersite.fr/rapport.html
Et pour automatiser la tâche tous les matins à 04h30, vous allez écrire un petit script que vous lancerez ensuite avec le cron : (Dans mon cas je récupère les logs de mon contenair proxy)
vi /root/gen_stats.sh #!/bin/bash # Lance la génération des log du proxy-reverse en excluant les ip local ssh proxy 'zcat -f /var/log/nginx/access.log*' | grep -v -f /usr/local/etc/goaccess/ip_exclues_goaccess.conf > /tmp/logStats # # Lance Goaccess avec les log de /tmp/logStats goaccess -p /usr/local/etc/goaccess/goaccess.conf /tmp/logStats -a --geoip-database /usr/local/etc/goaccess/GeoIP/GeoLite2-City.mmdb --ignore-crawlers --html-report-title='Rapport de stats pour xxxx.ovh' -o /var/www/html/monsupersite.fr/rapport.html
Maintenant vous le rendez exécutable :
chmod +x gen_stats.sh
Et vous le lancer à heure régulière avec le cron :
crontab -e # Env SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin # Goaccess 30 04 * * * /root/gen_stats.sh
Pensez à bien rajouter ces deux variables d’environnement (SHELL et PATH) en début de votre fichier crontab.
Sources :