Howto GoAccess

GoAccess est un outil d’analyse et de statisques des logs Apache ou Nginx (et d’autres formats). Il permet de générer rapidement une page de rapport HTML, de naviguer dans les stats en TUI et même de faire de la surveillance temps réel.

Installation

# apt install goaccess

goaccess -V
GoAccess - 1.7.
For more details visit: https://goaccess.io/
Copyright (C) 2009-2022 by Gerardo Orellana

Build configure arguments:
  --enable-utf8
  --enable-geoip=mmdb
  --with-openssl

Si besoin d’une version plus récente, l’upstream distribue des paquets Debian avec une version plus récente.

# install --mode 644 <(curl -L https://deb.goaccess.io/gnugpg.key) /etc/apt/keyrings/goaccess.asc
# install --mode 644 <(cat <<EOF
Types: deb
URIs: https://deb.goaccess.io
Suites: $(lsb_release -cs)
Components: main
Signed-By: /etc/apt/keyrings/goaccess.asc
EOF
) /etc/apt/sources.list.d/goaccess.sources
# apt update && apt install goaccess

Instructions pour Debian >= 11 (Bullseye) :

# echo "deb https://deb.goaccess.io $(lsb_release -cs) main" >> /etc/apt/sources.list.d/goaccess.list
# wget -O /etc/apt/trusted.gpg.d/goaccess.asc https://deb.goaccess.io/gnugpg.key
# dos2unix /etc/apt/trusted.gpg.d/goaccess.asc
# chmod 644 /etc/apt/trusted.gpg.d/goaccess.asc
# apt update && apt install goaccess

Configuration

Format des logs

On peut ensuite éditer /etc/goaccess.conf, par exemple pour changer le format de log :

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

Pour HAProxy, selon les versions, on peut tester les log-format suivants :

log-format %^ %^ %^ %^ %^ %^ %h:%^ [%d:%t.%^] %^ %^ %^/%^/%^/%L/%^ %s %b %^ %^ %^ %^ %^ {%v|%u} "%m %U %H"

log-format %^ %~%^ %^ %^ %^ %h:%^ [%d:%t.%^] %^ %^ %^/%^/%^/%L/%^ %s %b %^ %^ %^ %^ %^ {%v|"%u"} "%r"

log-format %^]%^ %h:%^ [%d:%t.%^] %^/%^/%^/%^/%L/%^ %s %b %^"%r"

Pour aller plus loin, voir la documentation de log-format : https://goaccess.io/man#custom-log

Note pour HaProxy : si on fait écouter HaProxy sur les port 80 et 443 avec l’option v4v6, HaProxy loggue toutes les IPs en mapping IPv4 vers IPv6 (::ffff:<IPv4>). GoAccess ne sait pas lire ce format hybride. Une solution est de séparer les deux formats d’IP dans HaProxy, comme indiqué dans cette discussion.

Géolocalisation des IP

Une fois les base de donnés d’IP de DBIP téléchargés, il suffit de rajouter la configuration suivante dans le fichier /etc/goaccess.conf afin que GoAccess les utilise et affiche des panneaux sur les pays et les ASN des visiteurs :

geoip-database /usr/local/share/mmdb/dbip-asn-lite.mmdb
geoip-database /usr/local/share/mmdb/dbip-city-lite.mmdb
geoip-database /usr/local/share/mmdb/dbip-country-lite.mmdb

Utilisation

Raccourcis de base pour naviguer dans l’interface NCurse :

  • Naviguer entre les modules : Tab / Shift+Tab (ou le numéro du module 1-10, mais ne permet pas d’aller au-delà de 10)
  • Naviguer dans la page principale : ArrowUp / ArrowDown
  • Dérouler le contenu d’un module : Enter
  • Naviguer dans un module : PgUp / PgDown
# goaccess /var/log/apache2/access.log

Si vous utilisez le format de logs COMBINED ou VCOMBINED s’il y a des vhosts :

# goaccess /home/foo/log/access.log --log-format=COMBINED
# goaccess /var/log/apache2/access.log --log-format=VCOMBINED

Note : avec d’anciennes versions (comme 0.8.3), la syntaxe était goaccess -f access.log

Si on veut cibler un fenêtre temporelle particulière ou accélérer le traitement, on filtrera avec grep dans un fichier temporaire :

# grep "<PATTERN>" /var/log/apache2/access.log > goaccess.tmp
# goaccess goaccess.tmp --log-format=VCOMBINED

Dans ce cas, on peut aussi ajouter l’option -a, qui indique les User-Agent dans le panneau « Visitor Hostnames and IPs » (rappel : entrée pour dérouler le panneau).

Pour générer un rapport HTML (un seul fichier, les styles sont inline) :

# goaccess /var/log/apache2/access.log --log-format=VCOMBINED -a -o /var/www/rapport.html

Pour suivre un access.log en temps réel :

# goaccess -f access.log --log-format=VCOMBINED

Pour avoir un access de 12h à 16h du 1er Fevrier :

# grep "1/Fev/2017:1[2-6]" /var/log/apache2/access.log > goacces.tmp
# goaccess -f goaccess.tmp --log-format=VCOMBINED -a -o html

On peut éviter de passer un fichier temporaire et faire un pipe, pour cela on peut faire :

# grep "1/Fev/2017:1[2-6]" /var/log/apache2/access.log | goaccess --log-format=VCOMBINED --num-tests=0 -f -

goaccess ne nous laissera pas choisir de format si on utilise stdin - ; c’est pour cela qu’il faut spécifier le format utilisé

--num-tests=0 permet d’ignorer les lignes qui ne matchent pas correctement un pattern d’heure ; on a remarqué qu’il pouvait y avoir plus de ligne en erreur quand passe par un pipe ; (par défaut si 10 lignes sont testé négativement goaccess fait une erreur et ne vas pas plus loins)

On peut aussi indiquer le format que goaccess va devoir utiliser dans /etc/goaccess.conf

log-format VCOMBINED #pour apache en général

Bases de données GeoIP (géolocalisation)

Jusqu’à Debian Buster (<= 10), on peut installer le paquet geoip-database pour que GoAccess analyse aussi les IPs par pays.

À partir de Debian Bullseye (>= 11), GoAccess est compilé avec l’option --enable-geoip=mmdb (nouveau format MMDB) et non --enable-geoip=legacy (ancien format DAT). En conséquence, il ne peut plus lire les bases de données au format legacy DAT fournies par le paquet geoip-database dans /usr/share/GeoIP/.

En attendant que le paquet geoip-database embarque des bases de données au format MMDB, on peut fournir soi-même le chemin d’une base de données MMDB avec l’option --geoip-database.

GoAccess comprend aussi les bases de données d’IPs des systèmes autonomes (AS).

On peut lui passer l’option --geoip-database plusieurs fois, ce qui lui permet d’afficher à la fois les pays et les AS, par exemple :

goaccess --geoip-database my_ASN-IPDB.mmdb --geoip-database my_Country-IPDB.mmdb /var/log/apache2/access.log

Pour se procurer des bases de données GeoIP, voir le HowtoGeoIP.

Interface web GoAccess via WebSocket

Pour avoir le suivi en temps réel dans un navigateur, il faut servir le fichier HTML généré par Goaccess ainsi que l’exécuter en tant que démon pour recevoir les données en temps réel via sa WebSocket.

On peut créer une unité systemd qui lancera GoAccess et sa WebSocket.

/etc/systemd/system/goaccess.service :

[Unit]
Description=GoAccess real time web stats.
After=network.target

[Service]
ExecStart=/usr/bin/goaccess -p /etc/goaccess/goaccess.conf /var/log/haproxy.log -o /var/www/goaccess.html --real-time-html
Type=simple
User=goaccess
Nice=19
IOSchedulingPriority=7

[Install]
WantedBy=default.target
# systemctl daemon-reload
# systemctl enable goaccess
# systemctl start goaccess

On sert ensuite /var/www/goaccess.html via Apache et on « proxifie » par la WebSocket :

<VirtualHost *:443>
        ServerName example.org

        Include /etc/apache2/ssl/example.conf
        DocumentRoot /var/www/

        # Goaccess
        <Location "/goaccess.ws/">
            ProxyPass "ws://localhost:7890/"
        </Location>
</VirtualHost>

Notez qu’ainsi Apache fait la terminaison SSL sans que Goaccess accède aux certificats.

Enfin, nous pouvons indiquer au client Goaccess (dans le navigateur) d’accéder au WebSocket via l’URL proxifié par Apache. Il est important d’utiliser un nom de domaine et non une adresse IP autrement Apache dirigera la requête vers le Vhost par défaut, ici example.com.

/etc/goaccess/goaccess.conf :

ws-url wss://example.com:443/goaccess.ws/

FAQ

Fatal error has occurred

Fatal error has occurred
Error occured at: src/parser.c - parse_log - xxxx
No log format was found on your conf file.

Si cette erreur survient, il faut modifier le fichier de conf /etc/goaccess.conf pour décommenter les valeurs logformat correspondantes.

Texte illisible à cause des couleurs

Le texte peut être illisible à cause du choix des couleurs de GoAccess, particulier si on utilise un terminal avec un thème clair. Il est possible de modifier les couleurs avec l’option --color, mais c’est assez lourd : il faut changer les couleurs pour chaque élément de l’interface. Un contournement est de désactiver les couleurs avec l’option --no-color.