---
categories: web sysadmin system
title: Howto GoAccess
...

* Documentation: <https://goaccess.io/man>

[GoAccess](https://goaccess.io) est un outil pour analyser facilement des logs Apache ou Nginx (et d'autres formats) : générer rapidement une page de rapport HTML, stats ncurses et même surveillance temps réel.

~~~
# apt install goaccess
~~~

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

~~~
# 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 geoip-database
~~~

Il faut ensuite éditer `/etc/goaccess.conf`, en choisissant le format de log, par exemple :

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

Pour HAProxy, le `log-format` est le suivant :

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

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

avec GoAccess 0.8.3 :

~~~
# goaccess -f access.log -a -o html
~~~

avec GoAccess 1.2 :

~~~
# goaccess access.log -a -o /var/www/rapport.html
~~~

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

~~~
# goaccess -f access.log
~~~

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 -a -o html
~~~

# Interface web + 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.

## Systemd
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

[Install]
WantedBy=default.target
~~~

~~~
# systemctl daemon-reload
# systemctl enable goaccess
# systemctl start goaccess
~~~

## Apache
On sert /var/www/goaccess.html via Apache et on proxifie le 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 ai besoin d'accéder aux certificats.

## Goaccess

On indique 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.org.

`/etc/goaccess/goaccess.conf` :

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


# Erreur

~~~
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écomenter les valeurs logformat correspondant. 
