Apache Logs in MySQL Datenbank schreiben
Konfiguration der MySQL Datenbank
Zuerst erstellen wir eine mysql Datenbank mit den Namen
logs.
mysql> CREATE DATABASE logs CHARACTER SET utf8 COLLATE utf8_general_ci;
Dann erstellen wir uns in dieser Datenbank eine Tabelle
access.
mysql> USE logs;
mysql> CREATE TABLE access (
date datetime not null,
host varchar(255) not null,
method char(4) not null,
url varchar(255) not null,
auth varchar(50),
browser varchar(50),
referer varchar(255),
status smallint(3) not null,
bytes int(8) default 0
);Als letzten Schritt erstellen wir den User
www-data mit den Rechten
INSERT auf der Datenbank
logs.
mysql> GRANT INSERT ON `logs` . * TO 'www-data'@'localhost';
mysql> FLUSH PRIVILEGES;
Konfiguration des Apache
In der Datei
/etc/apache2/apache.conf erstellen wir uns ein Logformat und nennen es
mysql.
# /etc/apache2/apache.conf
…
LogFormat "\"%{%Y-%m-%d %H:%M:%S}t\" %h \"%r\" %u \"%{User-agent}i\" %{Referer}i %s %b" mysql
...In der Datei
/etc/apache2/sites-available/default definieren wir als CustomLog dieses neu erstellte Logformat, mit dem Pfad zum Perl Programm, was die Logs in die Datenbank schreibt.
<VirtualHost *:80>
....
CustomLog "| /home/tux/bin/mysqllog.pl" mysql
....
</VirtualHost>
Perl Programm was die Logs in die Datenbank schreibt
Nun erstellen wir noch das Perl Programm, was die ApacheLogs in die Datenbank schreibt.
#!/usr/bin/perl
# script: mysqllog.pluse DBI;use constant DSN => 'dbi:mysql:logs';
use constant DB_TABLE => 'access';
use constant DB_USER => 'www-data';
use constant DB_PASSWD => '';$PATTERN = '"([^"]+)" (\S+) "(\S+) (\S+) [^"]+" (\S+) "([^"]+)" (\S+) (\d+) (\S+)';$db = DBI->connect(DSN,DB_USER,DB_PASSWD) || die DBI->errstr;
$sth = $db->prepare("INSERT INTO ${\DB_TABLE} VALUES(?,?,?,?,?,?,?,?,?)") || die $db->errstr;while (<>) {
chomp;
my ($date,$host,$method,$url,$user,$browser,$referer,$status,$bytes) = /$PATTERN/o;
$user = undef if $user eq '-';
$referer = undef if $referer eq '-';
$browser = undef if $browser eq '-';
$bytes = undef if $bytes eq '-';
$sth->execute($date,$host,$method,$url,$user,$browser,$referer,$status,$bytes);
}$sth->finish;
$db->disconnect;# EOF
Screens