Mit syslog-ng in Mysql DB loggen

tr0nix

tr0nix

der-mit-dem-tux-tanzt
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":
Code:
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):
Code:
## Log syslog-ng to mysql database
destination d_mysql {
file("/var/log/mysqllog/todo" owner("mysqllog") group("adm") perm(0600)
template("[b]USE syslog[/b]; 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:
Code:
#!/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:
Code:
cronjob -u mysqllog -e
Code:
#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
 
Zuletzt bearbeitet:
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!
 

Ähnliche Themen

Ubuntu 14.4: Samba v3 => v4, Kein Zugriff

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Akonadi startet nicht mehr

Windows clients können nicht mehr auf lange laufendes System zugreifen

Zurück
Oben