Logfiles von Hosteurope in Piwik importieren

Zugegeben, alles ein kleine Spielerei.

Piwik bietet ja die Möglichkeit, die Logfiles direkt zu importieren.
Klingt alles sehr einfach. Ist es vermutlich auch, wenn man standardisierte Logfiles von Apache/nginx/IIS hat.

Kommt halt immer auf den Hoster und/oder die Konfiguration an, Hosteurope schreibt die Logs nicht pro Domain, sondern nur pro Webpaket,womit die Variable –add-sites-new-hosts beim Ausführen der import_logs.py erstmal einen Fehler auswirft.

Möglichkeit 1:
Die Logfile für alle Webseiten in eine im Piwik angelegte Webseite importieren.
Nö. Kommt ja aufs gleiche raus wie die vom Hoster gelieferten Webalizer Statistiken.

Möglichkeit 2:
Logfiles für alles Domains irgendwie automatisch splitten lassen und jeweils einzeln in Piwik importieren lassen.
Nö! Zu aufwändig. Und überhaupt.

Möglichkeit 3:
Das Importscript irgendwie dazu bekommen, die Logfile vollautomatisch auszuwerten und zu importieren.
Dingdingding!

Die Logfiles werden so geliefert:
(ja, geändert!)

941.288.785.918 - - [28/May/2015:22:16:10 +0200] "GET /pfad/zur/datei/style.css HTTP/1.1" 200 1858 "http://der-roe.de" "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0" "der-roe.de"

Das Problem: Das Importscript erkennt den Hostnamen am Ende nicht, das ist so nicht vorgesehen und nicht die Standardeinstellung vom Apache. Hat Hosteurope wohl noch den VHost hinten angehängt.

Im Debugmodus mit einer gekürzten Log wurde ausgeworfen, dass das im Script vorhandene Format icecast2 am Besten passt, acht per RegEx abgegriffene Teile hat er gefressen, den Hostnamen halt nicht.

Da ist das böse Wort, RegEx.

Ja, ihr Programmierer lacht jetzt sicher über mich, ich hatte damit bisher (zum Glück) wenig zu tun. Und wenn, habe ich es jemanden erledigen lassen, der sich mit sowas auskennt :P.
Zum Glück gibt es aber Seiten wie RegEx101, da geht das ja auch fast automatisch.

Am Ende ist der Ausdruck

(?P<ip>\S+)\s+\S+\s+\S+\s+\[(?P<date>.*?)\s+(?P<timezone>.*?)\]\s+"\S+\s+(?P<path>.*?)\s+\S+"\s+(?P<status>\S+)\s+(?P<length>\S+)\s+"(?P<referrer>.*?)"\s+"(?P<user_agent>.*?)"\s+"(?P<host>[\w\-\.]*)(?::\d+)?"

herausgekommen, der frisst die Zeilen aus der Logfile.

Bevor ich das aber alles jedesmal von Hand mit der Option –log-format-regex dem Script liefere, habe ich mir die import_logs.py einfach kopiert und den Quelltext leicht abgeändert.

So sieht die Datei jetzt zwischen Zeile 379 und 395 aus:

 
_HEU = (
    '(?P<ip>\S+)\s+\S+\s+\S+\s+\[(?P<date>.*?)\s+(?P<timezone>.*?)\]\s+"\S+\s+(?P<path>.*?)\s+\S+"\s+(?P<status>\S+)\s+(?P<length>\S+)\s+"(?P<referrer>.*?)"\s+"(?P<user_agent>.*?)"\s+"(?P<host>[\w\-\.]*)(?::\d+)?"'
)

FORMATS = {
    'common': RegexFormat('common', _COMMON_LOG_FORMAT),
    'common_vhost': RegexFormat('common_vhost', _HOST_PREFIX + _COMMON_LOG_FORMAT),
    'ncsa_extended': RegexFormat('ncsa_extended', _NCSA_EXTENDED_LOG_FORMAT),
    'common_complete': RegexFormat('common_complete', _HOST_PREFIX + _NCSA_EXTENDED_LOG_FORMAT),
    'w3c_extended': W3cExtendedFormat(),
    'amazon_cloudfront': AmazonCloudFrontFormat(),
    'iis': IisFormat(),
    's3': RegexFormat('s3', _S3_LOG_FORMAT),
    'icecast2': RegexFormat('icecast2', _ICECAST2_LOG_FORMAT),
    'nginx_json': JsonFormat('nginx_json'),
    'HEU': RegexFormat('HEU', _HEU),
}

Ich importiere jetzt zum Test erstmal die Logfiles einzeln mit dieser Syntax:

python /path/to/piwik/misc/log-analytics/import_logs2.py --log-format-name=HEU --url=http://$server/piwik/ --add-sites-new-hosts --enable-http-errors --enable-http-redirects --enable-static --enable-bots --enable-reverse-dns --recorders=1 $logfile 

Funktioniert soweit, wenn auch aufwändig.

Das wird in Zukunft noch automatisiert. Irgendwie. Irgendwann.

Heruntergeladen werden die Logfiles derzeit auch schon automatisch wenn auch verbesserungswürdig.
Dazu aber in einem anderen Post mehr.

Tagged , , , , , , , , . Bookmark the permalink.

2 Responses to Logfiles von Hosteurope in Piwik importieren

  1. Ralf says:

    Glaub mir – niemand lacht über reguläre Ausdrücke.
    Aber spaßig damit zu arbeiten ist es schon irgendwie! 😉 Fast wie Kreuzworträtsel lösen! 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.