Der ansehnliche HTML-Report von GoAccess mit Daten aus einem Monat, hier mit den Panels Overall Analyzed Requests, Requested Files und Unique visitors per day
Der "ansehnliche" HTML-Report von GoAccess mit Daten aus einem Monat, hier mit den Panels "Overall Analyzed Requests", "Requested Files" und "Unique visitors per day"

GoAccess bietet die Möglichkeit die flüchtigen Access Logs des Webservers dauerhaft in einem dateibasierten Datenbankmanagementsystem1, hier einer Tokyo Cabinet On-Disk B+ Tree Datenbank2 zu speichern. So lassen sich auch längere Zeitspannen mit GoAccess auswerten.

Dieser Artikel beschreibt, wie du mit einem Cronjob die Logfiles wiederholend in einer solchen Datenbank persistierst3 4 und wie auch noch ein ansehnlicher HTML Report, der auf unser erzeugtes DBM zugreift, hinten rausfällt.

In meinem Artikel über den GoAccess Web Log Analyzer habe ich den Abschnitt Installation von GoAccess um die Abhängigkeit zur Tokyo Cabinet Datenbank entsprechend ergänzt.

Vorbereitungen

Anknipsen der Access Logs auf U7

Wenn du auch Uberspace 7 nutzt, dann musst du die Access Logs erst aktivieren5, da per Default gar keine Webserver Logs geschrieben werden, was aus Gründen der Datensparsamkeit schon ziemlich cool ist.

uberspace web log access enable

Zukünftige Heimat der Datenbank

Da GoAccess seine Datenbank per Default nach /tmp schreibt,
wo a), die Dateien flüchtig sind
und b), von jedem lesbar sind,
legen wir in unserem $HOME extra ein Verzeichnis dafür an.

mkdir $HOME/goaccess.db

Zeitpunkt für die Cronjobs bestimmen

Wann erfolgt die Rotation6 der Webserver Logfiles?

ls -l logs/webserver/

Am Beispiel eines U7 Accounts werden sieben Web Access Logs vorgehalten. Hier wird um 03:54 das aktuellste Logfile access.log nach access_log.1 rotiert.

insgesamt 15668
-rw-r--r--. 1 root root  582507  9. Jan 10:45 access_log
-rw-r--r--. 1 root root 1839549  9. Jan 03:54 access_log.1
-rw-r--r--. 1 root root 2194096  8. Jan 03:59 access_log.2
-rw-r--r--. 1 root root 2115343  7. Jan 03:59 access_log.3
-rw-r--r--. 1 root root 2161323  6. Jan 03:59 access_log.4
-rw-r--r--. 1 root root 1999593  5. Jan 03:59 access_log.5
-rw-r--r--. 1 root root 2332544  4. Jan 03:58 access_log.6
-rw-r--r--. 1 root root 2744661  3. Jan 03:59 access_log.7

Somit enthält access_log.1 die Zugriffe von Vorgestern ab 03:54 bis Gestern um 03:54.

Ein guter Zeitpunkt wäre diese Datei gegen Vier Uhr in der Datenbank zu persistieren.

Der Einzeiler zum Prozessieren des Access Logs

Dieser Einzeiler, den wir als $HOME/bin/goaccess_process_log_into_db.sh speichern
und via chmod u+x $USER/bin/goaccess_process_log_into_db.sh ausführbar machen, bereitet das obige AccessLogFile auf und persistiert es in der Datenbank:

#!/bin/bash

goaccess \
  --log-file=$HOME/logs/webserver/access_log.1 \
  --log-format=COMBINED \
  --process-and-exit \
  --agent-list \
  --keep-db-file --load-from-disk --db-path=$HOME/goaccess.db/ 

Access Logs werden auf Uberspace anonymisiert, auf u7 werden die ersten 16 Bits einer IPv4 Addresse und die ersten 32 Bits einer IPv6 Adresse protokolliert.

Wäre das nicht der Fall, dann solltest du auf die Option --anonymize-ip von GoAccess zurückgreifen.

Der Einzeiler zur Generierung des HTML-Reports aus der Datenbank

Dieser Einzeiler, den wir als $HOME/bin/goaccess_db_to_html.sh speichern
und via chmod u+x $USER/bin/goaccess_db_to_html.sh ausführbar machen, generiert einen HTML Report aus der Datenbank.

#!/bin/bash

goaccess \
  --log-format=COMBINED \
  --agent-list \
  --keep-db-file --load-from-disk --db-path=$HOME/goaccess.db/ \
  --output $HOME/index.html

Dein HTML-Report ist nun über https://deinusername.uber.space erreichbar.

Gegebenenfall möchtest du das Verzeichnis ~/html mit einen Passwortschutz7 via .htaccess versehen um es vor fremden Blicken zu schützen.

Verwendete Optionen mit Datenbankbezug

  • --process-and-exit, Ideal für Cronjobs: Parsen und Ende,
    keine Ausgabe via ncurses oder in eine Datei.
  • --keep-db-file, persistiere die geparsten Daten in der Datenbank.
  • --load-from-disk, lade die Datenbank um neue Daten hinzuzufügen.
  • --db-path=$HOME/goaccess.db/, der Ort an dem die On-Disk-Datenbank leben und wachsen soll.

Tokyo Cabinet Optionen in goaccess.conf

Die obigen Optionen hier analog für die unsere ~/etc/goaccess/goaccess.conf:

keep-db-files true
load-from-disk false
db-path /home/deinusername/goaccess.db/

Für eine Minimalkonfiguration siehe auch GoAccess Web Log Analyzer: ~/etc/goaccess/goaccess.conf.

Die Cronjobs anlegen

Mit den folgenden Jobs sorgen wir für eine wiederholende, dauerhafte Speicherung der Access Logs in der Datenbank und einen auf der Datenbank basierenden HTML Report:

crontab -e
5 4 * * * $HOME/bin/goaccess_process_log_into_db.sh
10 4 * * * $HOME/bin/goaccess_db_to_html.sh

Fallstricke

Pitfalls aka Lessons learned oder Erfahrungen, die ihr nicht unbedingt auch machen wollt:

  • Bei einer mehrfachen Ausführung auf das gleiche Logfile merkt sich GoAccess nicht, das die Datei schonmal geparst wurde. Ergo: Die Daten für den jeweiligen Zeitraum sind n mal aufgenommen worden.
  • Der Weg zu einer schönen Lösung:
    Wenn GoAccess auf uberspace 6 via Cron aufgerufen wird, dann kennt GoAccess nicht mehr den Pfad zur selbstinstallierten libtokyocabinet.so.9 Bibliothek.

    goaccess: error while loading shared libraries: libtokyocabinet.so.9:
    cannot open shared object file: No such file or directory.

    • Ein source $HOME/.bash_profile in den Skripten macht alle nötigen Umgebungsvariablen verfügbar. Finde ich hässlich und es hat nichts mit der Funktion zu tun, zudem ist es in beiden Skripten nötig.
    • Etwas schöner, aber immer noch zwei mal nötig: Dem Cron Command vorangestellt8:
      5 4 * * * source $HOME/.bash_profile ; $HOME/bin/goaccess_process_log_into_db.sh
    • BASH_ENV9! Sofern die BASH, wie bei Shell Skripten und Cronjobs nicht interaktiv gestartet wird, wird versucht auf diese Variable BASH_ENV zuzugreifen und die angegebene Datei ($HOME/.bash_profile) auszuwerten10.
      Füge die folgenden zwei Zeilen vor den Cronjobs ein:
      SHELL=/bin/bash
      BASH_ENV=$HOME/.bash_profile
      
  • Einmal das --keep-db-file vergessen, schon ist die mühsam angelegte Datenbank futsch.
  • Der Trailing Slash bei der Angabe von --db-path ist wichtig, sonst gehts nicht.