Zurück zu meinem Steckenpferd. Im folgenden geht es darum, wie man aus einer Logdatei für OpenArena eine sinnvolle Spielstatistik erstellen kann. OpenArena ist kurz gesagt ein modifiziertes Quake3 mit Medieninhalten, die vollständig unter einer freien GPL-Lizenz stehen. Für meinen öffentlichen OpenArena-Server habe ich mich für Deathmatch entschieden, da ich das Gefühl hatte, die meisten Spieler bevorzugen diesen Spielmodus.
Ein weiterer Vorteil ist sicherlich, dass "Jeder-gegen-Jeden" am einfachsten zu überwachen ist, denn im Prinzip geht es nur darum, dass Spieler X Spieler Y fraggt und alles ein Zeitspiel ist.
Es gibt verschiedene Werkzeuge und Programme, die einem beim Erstellen von Statistiken helfen können. Im Grunde läuft es aber immer auf das Parsen der Logdatei heraus. Das OpenArena-Wiki führt hier z.B. VSP, AEstats oder oastats an.
Für mich war nur eine Sache klar. Ich wollte keinen zusätzlichen Datenbank-Server. Irgendwie erschien mir das nicht die richtige Lösung zu sein, um eine einzelne Logdatei zu parsen.
Der Gewinner war schließlich Pyqscore.
Pyqscore ist ein in Python geschriebenes Programm, dass die Datei games.log analysieren kann und zusätzlich noch einen Cache benutzt, damit schon zuvor analysierte Werte nicht noch einmal ausgewertet werden müssen.
Das ursprüngliche Skript pyqscore.py habe ich auf meinem Server in /usr/local/bin abgespeichert. Es wird täglich mit Hilfe von Cron ausgeführt. Erwähnt hatte ich es schon bei meinem Cron- und Logrotate-Beispiel.
Jeden morgen wird deswegen die zuvor mit Logrotate rotierte Datei games.log.1 ausgewertet und als daily.htm abgespeichert. Mit Hilfe von cat addiere ich alle täglichen Logdateien in die Datei monat.log, worüber ich dann ein leicht modifiziertes Pyqscore ausführen lasse, dass die Statistik des Monats wiederum in der Datei monthly.htm abspeichert.
Für die täglichen Statistiken benutze ich dieses Skript
#!/bin/sh # Tägliche Statistiken mit pyqscore erzeugen, im HTML-Format ausgeben und mit tidy säubern set -e Base="/var/games/openarena-server/.openarena/baseoa/" cd $Base if [ -f games.l_cache.p ]; then rm games.l_cache.p fi /usr/local/bin/pyqscore.py games.log.1 /usr/bin/tidy -utf8 -m -q daily.htm || true
Hier wird jeden Tag in das entsprechende Verzeichnis gewechselt und der alte Cache gelöscht. Das ist notwendig, weil Pyqscore bei einer größeren Logdatei den Cache zum schnelleren Analysieren heranzieht, bei kleineren Logdateien aber eine komplett neue Cache-Datei anlegt.
Damit keine Fehler entstehen, lösche ich den Cache bei der täglichen Statistik. Anschließend wird nur noch die games.log.1 ausgewertet und mit Hilfe von Tidy gesäubert.
Ein anderes Skript kopiert dann automatisch die erzeugte daily.htm in das Webserver-Verzeichnis.
Für die monatlichen Statistiken verfahre ich so:
#!/bin/sh # Monatliche Statistiken mit pyqscore erzeugen und im HTML-Format ausgeben set -e Today=`/bin/date +%d` Month=`/bin/date -d "last month" +%m` Year=`/bin/date +%y` Base="/var/games/openarena-server/.openarena/baseoa/" if [ $Today -eq 02 ]; then rm ${Base}monat.log cp ${Base}monthly.htm ${Base}${Year}${Month}_stats.htm fi cd $Base cat games.log.1 >> monat.log /usr/bin/nice -19 /usr/local/bin/pyqscore_mon.py monat.log /usr/bin/tidy -utf8 -m -q monthly.htm || true
Ok, hier werden folgende Sachen überprüft. Am Morgen jedes zweiten Tages im Monat wird die alte Datei monat.log gelöscht und die Auswertung beginnt von vorne. Ich sichere danach die alte Datei monthly.htm.
Ursprünglich hatte ich daran gedacht, so etwas wie eine "Siegerehrung" zu machen, also eine Extraseite mit den ersten Plätzen. Sollte tatsächlich jemand das Bedürfnis nach einer solchen Seite haben, kann ich das nun immer noch nachtragen. 😉
Ansonsten wird die tägliche Logdatei an die monatliche angehängt und ausgewertet und das ganze wieder mit Tidy ordentlich aufbereitet. Damit ich nicht permanent E-Mails von Cron mit Fehlermeldungen erhalte, erzwinge ich den Exit-Status von Tidy mit "true". Ansonsten kann man jeden Tag lesen, dass die ursprüngliche HTML-Datei Fehler enthalten hat.
Das war es im Prinzip auch schon. Der Vorteil von Pyqscore liegt darin, dass man statische HTML-Seiten mit Statistiken erhält ohne zuvor eine Datenbank installiert zu haben. Bei einem Projekt, wo es um jedes MB Arbeitsspeicher geht, sicher ein Vorteil.
Ich habe Pyqscore an meine Bedürfnisse angepasst. Im Laufe der Zeit sind mir bisher ein paar kleinere Schwächen aufgefallen, die ich versucht habe zu beseitigen. Für alle Interessierten biete ich Pyqscore hier zum Download an.