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
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 "https://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
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
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.
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! 😉
Spaß ist anders. Sehr viel ganz arg anders. 🙁