Tail in MySQL-DB

Hallo.

Ich möchte gern meine Apache-Logs live in eine MySQL-DB schreiben. Wie ich das mache weiß ich grundsätzlich, aber es gibt noch ein paar Probs.
Wenn ich einen Datensatz eingefügt hab, bricht er ab:

tail -f $log\_file | echo "INSERT INTO test SET ... | mysql $mysql\_db -u$mysql\_usr -p$mysql\_pass

Außerdem ist mir auch noch nicht ganz klar, wie ich am besten die Spalten trenne.
Hat jmd einen Tipp für mich?

Gruß, Andreas

Hallo,

Ich möchte gern meine Apache-Logs live in eine MySQL-DB
schreiben.

Dann würde ich die PerlLogHandler-Direktive von Apache verwenden - die ist genau für solche Sachen gedacht. Als Beispiel, das diese Schnittstelle verwendet, kenne ich Apache::SearchEngineLog http://verplant.org/SearchEngineLog/

Außerdem ist mir auch noch nicht ganz klar, wie ich am besten
die Spalten trenne.

Das geht nicht so einfach. Zwischen den einzelnen Einträgen sind zwar Leerzeichen, aber die Einträge können auch Leerzeilen enthalten.
Ich habe ein Perlscript geschrieben, dass auf Apache-Logs im „cobined“-Format (das gebräuchlichste, glaube ich) losgeht. Das verwendet diesen Code:

if (m/^([^]\*) ([^]\*) ([^]\*) \[([^\]]+)\] "((?:[^"]|\\")\*?)" (\d+) (-|\d+) "((?:[^"]|\\")\*)" "((?:[^"]|\\")\*)"/){
 my ($ip, $ignore, $remote\_user, $date, $request, $status, 
 $size, $ref, $ua) 
 = ($1, $2, $3, $4, $5, $6, $7, $8, $9);

Die Variablennamen sollten fast Selbsterklärend sein ($ref steht für den Referer, $ua für den User Agent).

Hast du mal gesucht, ob es schon ein kleines Programm gibt, das genau das tut, was du willst?

Grüße,
Moritz

Dann würde ich die PerlLogHandler-Direktive von Apache
verwenden - die ist genau für solche Sachen gedacht. Als
Beispiel, das diese Schnittstelle verwendet, kenne ich
Apache::SearchEngineLog http://verplant.org/SearchEngineLog/

Ohne Test hab ich jetzt erstmal Zweifel, da ich letztens versucht hab da Format umzustellen und da ging der Apache nicht mehr zu starten. Ich dachte damals, dass es vllt daran lag, dass mein Plesk das nicht zu lässt und da irgendwas an dem Apache rumgepfuscht wurde.
Werde es heut Nachmittag mal probieren. - Aber Prinzipiell ist mir das mit dem Tail lieber, weil ich die Logs auch als Datei irgendwie noch bisschen archivieren will - oder geht das beides gleichzeitig?

Das geht nicht so einfach. Zwischen den einzelnen Einträgen
sind zwar Leerzeichen, aber die Einträge können auch
Leerzeilen enthalten.
Ich habe ein Perlscript geschrieben, dass auf Apache-Logs im
„cobined“-Format (das gebräuchlichste, glaube ich) losgeht.
Das verwendet diesen Code:

if (m/^([^]*) ([^]*) ([^]*) [([^]]+)]
„((?:[^“]|\")*?)" (\d+) (-|\d+) „((?:[^“]|\")*)"
„((?:[^“]|\")*)"/){
my ($ip, $ignore, $remote_user, $date, $request, $status,
$size, $ref, $ua)
= ($1, $2, $3, $4, $5, $6, $7, $8, $9);

Die Variablennamen sollten fast Selbsterklärend sein ($ref
steht für den Referer, $ua für den User Agent).

Gut, je nachdem ob das oben ordentlich machbar werde ich das hier mal testen.

Gruß, Andreas

Hallo,

Werde es heut Nachmittag mal probieren. - Aber Prinzipiell ist
mir das mit dem Tail lieber, weil ich die Logs auch als Datei
irgendwie noch bisschen archivieren will - oder geht das
beides gleichzeitig?

Sollte eigentlich, ja. Aber mein letzter Versuch scheiterte leider :frowning:.
Allerdings hatte ich da auch nur Zugriff auf die .htaccess-Datei, nicht auf die Config-Datei, in der der Virtual Host konfiguriert ist.

Das geht nicht so einfach. Zwischen den einzelnen Einträgen
sind zwar Leerzeichen, aber die Einträge können auch
Leerzeilen enthalten.
Ich habe ein Perlscript geschrieben, dass auf Apache-Logs im
„cobined“-Format (das gebräuchlichste, glaube ich) losgeht.
Das verwendet diesen Code:

if (m/^([^]*) ([^]*) ([^]*) [([^]]+)]
„((?:[^“]|\")*?)" (\d+) (-|\d+) „((?:[^“]|\")*)"
„((?:[^“]|\")*)"/){
my ($ip, $ignore, $remote_user, $date, $request, $status,
$size, $ref, $ua)
= ($1, $2, $3, $4, $5, $6, $7, $8, $9);

Die Variablennamen sollten fast Selbsterklärend sein ($ref
steht für den Referer, $ua für den User Agent).

Gut, je nachdem ob das oben ordentlich machbar werde ich das
hier mal testen.

Ok, sag mir ob das geht :wink:.
Nochwas: Wenn du das mit tail -f machst und zusätlich logrotate verwendest, hast du das Problem, dass immer wieder die Datei verschoben wird. Dann musst du tail killen und neu starten, weil keine neuen Einträge mehr reinkommen. Das ist also keine zuverlässige Alternative.

Grüße,
Moritz