GoAccess bietet die Möglichkeit die flüchtigen Access Logs des Webservers dauerhaft in einem dateibasierten Datenbankmanagementsystem, hier einer Tokyo Cabinet On-Disk B+ Tree Datenbank 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 persistierst 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 aktivieren, 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.
Zeitpunkt für die Cronjobs bestimmen
Wann erfolgt die Rotation der Webserver Logfiles?
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 Passwortschutz 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:
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 vorangestellt:
5 4 * * * source $HOME/.bash_profile ; $HOME/bin/goaccess_process_log_into_db.sh
- BASH_ENV! 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) auszuwerten.
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.