ISPConfig – Apache-Logfiles über syslog 1


In der Standardinstallation von ISPConfig werden die Apache-Logs über vlogger geschrieben.

Ich finde diese Lösung nicht besonders elegant, da dadurch bspw. die access-logs von Apache immer nur auf dem jeweiligen Server verfügbar sind. Ich habe aber mehrere Server, die die gleichen Domains ausliefern. Eigene Statistiken lassen sich nicht “eben mal so” erstellen. Dazu müssen erst die Logfiles zusammenkopiert werden.

Und da die übrigen Logfiles eh zentral auf einem Server auflaufen, habe ich vlogger durch syslog-ng ersetzt. Dazu muss nur “CustomLog” stimmen, das Logformat bleibt bei

LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig


/usr/local/ispconfig/server/conf/apache_ispconfig.conf.master anpassen:

CustomLog "| /bin/logger -t apache2" combined_ispconfig


und dann noch

/etc/apache2/sites-available/ispconfig.vhost:

CustomLog "| /bin/logger -t apache2" combined_ispconfig


Damit gehen alle Apache-Logs direkt an logger und von dort an syslog-ng.

Um Logs pro Domain schreiben zu können, muss syslog-ng auch noch entsprechend konfiguriert werden. Ich verwende zum Splitten der Logs die pattern-db. Es geht zwar auch mit dem CSV-Parser, der ist aber weniger flexibel und nicht ganz so schnell. Da die pattern-db aber etwas komplizierter zum Einrichten ist, poste ich hier nur die Verwendung des CSV-Parsers.

Am Ende des Artikels lassen sich die jetzt genannten Files (auch mit der pattern-db) direkt downloaden. Cut & paste beim Lesen muss also nicht sein. 😉

Die destinations für syslog:

destination d_apache-logs {
file("/var/log/ispconfig/httpd/${.apache.domain}/${YEAR}${MONTH}${DAY}-access.log"
template("${.apache.client_ip} ${.apache.ident_name} ${.apache.user_name} ${.apache.timestamp} ${.apache.timestamp2} \"${.apache.request_url}\" ${.apache.request_status} ${.apache.content_length} \"${.apache.referer}\" \"${.apache.user_agent}\"\n")
template_escape(yes)
perm(0644));
};


Damit landen die Logfiles in /var/log/ispconfig/httpd/DOMAIN – das kann nach belieben angepasst werden.

Zugegeben, das Template splittet das Logfile in sehr viele Teile auf, die nicht zwingend erforderlich sind. Es schadet aber nicht, jeden Teil des Logs in einer eigenen Variable zu haben.

Weiter gehts mit der syslog-ng.conf:

destination d_ispconfig_apache-stat {
program("/root/scripts/syslog/sql-log.sh"
template("INSERT INTO web_traffic VALUES ('${.apache.domain}',curdate(),${.apache.content_length}) ON duplicate KEY UPDATE traffic_bytes=traffic_bytes+${.apache.content_length};\n"));
};


Statt “program” kann man hier auch direkt die Angaben für den mysql-Zugriff machen. Ich will aber nicht die Zugangsdaten in der syslog-ng.conf haben.

Das würde dann so aussehen:

destination d_ispconfig_apache-stat {
program("/usr/bin/mysql -uispconfig -pPASSWORD dbispconfig"
template("INSERT INTO web_traffic VALUES ('${.apache.domain}',curdate(),${.apache.content_length}) ON duplicate KEY UPDATE traffic_bytes=traffic_bytes+${.apache.content_length};\n"));
};


Update 02.01.2013
Im Prinzip müsste es auch mit der mysql-destination von syslog-ng funktionieren. Ich bin nur noch nicht dahintergekommen, wie man dort “ON DUPLICATE KEY UPDATE” definieren kann.

Der sql-driver von syslog-ng 3.4 unterstützt kein “ON DUPLICATE KEY UPDATE”. Der einzige Weg ist tatsächlich die Verwendung des program-Parameters.
/root/scripts/syslog/sql-log.sh:

#!/bin/bash
#
# apache-stats to mysql
while read MSG; do
mysql -uispconfig -pPWD dbispconfig -e "$MSG"
done
exit 0


Das PWD steht in /usr/local/ispconfig/server/lib/config.inc.php.

Wie syslog-ng die Logs verarbeiten soll, wird so definiert:

log {
source(src);
parser(p_apache-access);
filter(f_apache2);
destination (d_apache-logs);
destination (d_ispconfig_apache-stat);
};


Wir brauchen also nur noch einen filter und den Parser.

Filter:

filter f_apache2 {
program('apache2')
};


Parser:

parser p_apache-access {
csv-parser(columns(
".apache.domain",
".apache.client_ip",
".apache.ident_name",
".apache.user_name",
".apache.timestamp",
".apache.timestamp2",
".apache.request_url",
".apache.request_status",
".apache.content_length",
".apache.referer",
".apache.user_agent")
flags(escape-double-char,strip-whitespace)
delimiters(" ")
quote-pairs('""\[\]') );
};

Das wars auch schon. 😉

Und hier ist das ganze nochmal als Download:

syslog-ng.conf

 

Downloads für die pattern-db von syslog:

syslog-ng.conf

Parser oder XML-File


Kommentar erstellen

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

Ein Gedanke zu “ISPConfig – Apache-Logfiles über syslog