PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit syslog-ng in Mysql DB loggen



tr0nix
13.09.2004, 16:51
Hallo zusammen

Das hier ist keine Anfrage sondern ein HowTo. Ich habe ein HowTo fuer dieses Thema gefunden, es funktionierte jedoch mit einem Fifo-File und hatte viele Nachteile und war fuer mich zu instabil.

Vorraussetzungen:
Software:
mysql Client und einen Server
syslog-ng

Sonstiges:
syslog Datenbank-User (inkl. INSERT Permissions auf das gewuenschte Table)
mysqllog System-User (von Hand erstellen, Shell kann /bin/false sein)
/var/log/mysqllog (Gehoert mysqllog-User, Permissions des Directories 700)
/var/log/mysqllog/todo (Gehoert mysqllog-User, Permissions des Files 600)
mysqllog Cronjob (kommt weiter unten)

Ich gehe davon aus, ihr habt eine DB namens "syslog". Hier die Struktur des Tables "logs":

CREATE TABLE logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;

Hier die syslog-ng Konfiguration (einfach an bestehende attachen):


## Log syslog-ng to mysql database
destination d_mysql {
file("/var/log/mysqllog/todo" owner("mysqllog") group("adm") perm(0600)
template("USE syslog; INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));
};

log { source(src); destination(d_mysql); };


Anschliessend die Datei /usr/local/sbin/mysqllog.sh erstellen:


#!/bin/bash
# Write log into database
# 13.9.2004 - JW

/usr/bin/mysql -h localhost -u syslog < /var/log/mysqllog/todo
echo "" > /var/log/mysqllog/todo


Optional koennt ihr noch den syslog-User Passwort schuetzen und das Script damit ergaenzen.

Nun den Cronjob fuer den User mysqllog erstellen:

cronjob -u mysqllog -e

#Put logs into DB
* * * * * /usr/local/sbin/mysqllog.sh

Das Script laeuft schoen sauber unter einem technischen User und wer's ganz sicher will, schuetzt den syslog-DB User noch durch ein Passwort. So kann ein verteilter Serverpark an eine Zentrale Stelle loggen.

Wer mag, kann das ganze noch ein wenig tunen, indem er statt
echo "" > /var/log/mysqllog/todo
dies macht:
echo "use syslog;" > /var/log/mysqllog/todo
und bei der syslog-ng.conf - Datei bei den Templates das "use syslog" rausnimmt.

Ich bin dabei, noch Ueberpruefungen einzubauen, ob die DB da ist etc. aber so laeuft das ganze schonmal recht sauber!

gruss
Joel

tr0nix
14.09.2004, 12:15
Kleine Korrektur vorgenommen, an der syslog-ng Konfiguration. Ansonsten wird das File mit root-Permissions ueberschrieben bei einem restart von syslog-ng und mysqllog-User kann das File nicht neu nullen und auch nicht lesen!

devilz
14.09.2004, 12:18
Wie wärs wenn du das HowTo ins Wiki kopierst ?

http://wiki.unixboard.de

Ich hoffe das das Wiki bald an etwas mehr Aufmerksamkeit gewinnt :)