Der Apache-Webserver erzeugt im Standard Logdateien, was auch gut ist. Manchmal braucht man für Auswertungen die Daten allerdings in einer Datenbank. Wie beispielsweise bei der Analyse der Downloadzahlen eines Podcasts. Genau fuer diesen Zweck wurde das Modul mod_log_sql geschrieben. Hier geht es jetzt um die Einrichtung und die Abfrage der Daten.
Auf Debian basierten Systemen wird mod_log_sql
mittels apt-get install libapache2-mod-log-sql-mysql
installiert. Bei uns soll es so sein, dass die Daten in der Datenbank apache landen und dort soll es pro Domain eine Tabelle geben.
CREATE USER 'apache'@'localhost' IDENTIFIED BY '***'; GRANT USAGE ON * . * TO 'apache'@'localhost' IDENTIFIED BY '***' ; CREATE DATABASE IF NOT EXISTS `apache` ; GRANT ALL PRIVILEGES ON `apache` . * TO 'apache'@'localhost';
In /etc/apache2/sites-available
erstellen wir dann eine Datei fuer die globale Konfiguration, bei uns 000global
:
LogSQLLoginInfo mysql://apache:PASSWORD@localhost/apache
LogSQLCreateTables on
LogSQLDBParam socketfile /var/run/mysqld/mysqld.sock
LogSQLTransferLogFormat IAbPcMfRhluTrmHtUapzqQsSV
Wichtig, diese Konfiguration muss ausserhalb einer VirtualHost-Directive liegen.
Fuer den VirtualHost richten wir jetzt innerhalb der vHost-Konfiguration den Namen der Tabelle mit LogSQLTransferLogTable deimhart_net
ein. Da wir nur den Download von mp3- und ogg-Dateien zaehlen wollen, schreiben wir noch LogSQLRequestAccept .mp3 .ogg
dazu (wenn man alles in die Datenbank protokollieren moechte, kann das entfallen). Die Tabellen werden automatisch erstellt, siehe LogSQLCreateTables on
.
Jetzt aktivieren wir alles noch mit folgenden Befehlen auf der Kommandozeile:
a2ensite 000global # Aktivierung der globalen Konfiguration apache2ctl graceful # Pruefen der Konfiguration und Neustart des Apache
Damit ist das Logging in die Datenbank abgeschlossen, um die Downloads auszuwerten, genügen drei einfache Schritte:
CREATE TABLE deimhart_episoden ( kurzname CHAR(30) NOT NULL, langname CHAR(90) NOT NULL, laenge BIGINT(20) UNSIGNED NOT NULL, PRIMARY KEY (`kurzname`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Erzeugt eine Tabelle, in die wir alle Dateien, die uns interessieren eintragen.
echo "truncate table deimhart_episoden;" > deimhart_episoden.sql ls -l /srv/www/deimhart.net/uploads/*.{mp3,ogg} | awk '{print $5, $8}' | while read laenge langname do echo "insert into deimhart_episoden values ('$(basename ${langname})','${langname}',${laenge});" done >> deimhart_episoden.sql mysql apache < deimhart_episoden.sql
Liest alle Dateien und deren Laengen aus dem Filesystem und schreibt das in die Datenbank.
SELECT e.kurzname,SUM(n.bytes_sent)/e.laenge FROM deimhart_episoden e, deimhart_net n WHERE e.langname=n.request_file
Obige Abfrage gibt abschliessend die Anzahl der Downloads aus. Berechnet wird sie durch die Summe der übertragenen Bytes pro Episode geteilt durch die Laenge der entsprechenden Episode.