neunzehn83.de

Ein Mann, ein Blog, kein Plan.

AWStats: die eigenen Besuche ausschließen

AWStats analysiert Logfiles und erstellt nette Statistiken. So auch hier für diesen Blog. Um die schier unfassbare Menge an Visits auch nur im Ansatz zu begreifen, rödelt also jede Nacht AWStats durch die Apache-Logfiles. Das hat im Gegensatz zu Google-Analythics den Vorteil, dass die Daten schön hier lokal gespeichert werden. Außerdem erfolgt die Erfassung der Daten Serverseitig und nicht per Javascript. Das wird nämlich von vielen Usern einfach geblockt (Hallo <noscript>!).

Statistiken sind nie zu 100% genau. Dennoch stört mich, dass die eigenen Hits in den Statistiken auftauchen. Das lässt sich aber verhindern..

Methode 1: eigener vHost

Einfach einen zweiten VHost, z.b. dev.domain.com anlegen. Der VHost zeigt ins selbe Verzeichnis wie die Hauptdomain, hat aber eine extra Logdatei. AWStats wertet nur die Logs der Hauptdomain aus. Die Links auf der Webseite müssen dazu aber zwingend relativ sein - sonst landet man früher oder später wieder auf der Hauptdomain und wird "erfasst".

Bei Wordpress stellte sich das schon mal als sehr schwierig heraus. Viele Links enthalten hier direkt den Domainnamen.

Methode 2: Apache conditional logging

Per conditional logging werden bestimmte Logeinträge erst gar nicht geschrieben. Als Kriterium kann z.B. die IP-Adresse verwendet werden. Mit DSL und daher dynamischer IP aber eher schwierig. Bleibt also nur noch der Cookie zur Identifikation. Wir setzen auf der eigenen Seite einen bestimmten Cookie, z.B. "DONTSTATME=true". Dazu einfach in die Adressleiste des Browsers folgendes tippen:
javascript:document.cookie="DONTSTATME=true; expires=Sat, 17 Dec 2021 22:59:00 GMT"

Nach reload der Seite ist der Cookie gesetzt. Jetzt können wir das conditional logging konfigurieren:

SetEnvIf HTTP_COOKIE "(^| )DONTSTATSME=true($|;)" dontlog
CustomLog logs/access_log common env=!dontlog

Nachteil hier: Requests mit diesem Cookie werden jetzt gar nicht mehr geloggt. Nirgends. Generell eine schlechte Idee. Irgendwie. Außerdem legt Syscp pro VHost automatisch einen CustomLog-Eintrag an, der sich leider nicht so leicht um "env=!dontlog" erweitern lässt. Zumindest nicht ohne an der Source rumzufummeln.

Methode 3: Logfile greppen

AWStats akzeptiert auch Logfiles von einer Pipe: mit grep -v DONTSTATME=true /path/to/log würden bei AWStats nur "richtige" Hits ankommen. Dazu muss man den LogFile-Parameter der AWStats-Config folgendermaßen anpassen (/etc/awstats/awstats.domain.com.conf):
LogFile="grep -v DONTSTATME=true /path/to/access.log |"

Problem: Das Apache "combined"-Logformat loggt gar keine Cookies. Lässt sich aber leicht ändern. Wir öffnen die Datei /etc/apache2/apache2.conf und suchen die Zeilen mit "LogFormat".

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" combined

Entweder die Zeile mit "combined" direkt abändern oder ein neues Logformat erstellen, z.B. combined-cookies.

Dann muss AWStats das neue Logformat noch mitgeteilt werden (/etc/awstats/awstats.domain.com.conf):

LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %otherquot"

Apache restart/force-reload und alles ist gut. Vorausgesetzt man vergisst nicht den Cookie zu setzten, wenn man Methode 2 oder 3 verwendet.

Wie jetzt?

Jede Methode hat Ihre Vor- und Nachteile. Keine ist Perfekt. Ich bin noch am evaluieren :D Im Endeffekt müssen einfach nur insgesamt genug Hits vorhanden sein. Dann spielen die paar eigenen Visits auch keine Rolle mehr und man muss sich um das ganze Zeug keine Gedanken mehr machen. Solange das nicht der Fall ist, macht es durchaus Sinn, sich die Mühe zu machen und die eigenen Besuche auszuschließen.

Geschrieben am Donnerstag, 17. Dezember 2009 und abgelegt unter Webtechnik.