Syslog-NG in MySQL loggen (Zentraler Syslog-NG Server) Updated

Wenn schon mal eine MySQL Datenbank auf einem Server liegt, liegt es nahe, diese Datenbank auch für andere Zwecke zu verwenden. In diesem Artikel wird gezeigt, wie man die Syslog-NG Meldungen in eine MySQL Datenbank bekommt.

 

Installation unter Gentoo Linux

emerge -pv syslog-ng dev-db/mysql

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   N   ] app-admin/syslog-ng-1.6.9  USE="tcpd -hardened -static"
[ebuild   N   ] dev-db/mysql-5.0.26-r2  USE="berkdb perl ssl -big-tables -cluster -debug -embedded -extraengine -latin1 -max-idx-128 -minimal -static"

Die Versionsnummern können sich unterscheiden, das ist für das hier gezeigte aber unrelevant.

Konfiguration MySQL

Zuerst muss eine Datenbank angelegt werden, die mit den passenden Benutzrerechten eingerichtet werden und die Tabelle eingerichtet werden.

linux ~ # mysqladmin create syslog
linux ~ # mysql mysql

mysql > GRANT INSERT on syslog.* to syslogfeeder@localhost identified by 'SuperPassWord';
mysql > flush privileges;

 Anschliessend wird die Tabelle in der Datenbank mit folgendem CREATE TABLE Befehl angelegt:

---
--- syslog_table.sql
---

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,
  `datetime` datetime default NULL,
  `program` varchar(15) default NULL,
  `msg` text,
  `seq` bigint(20) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`seq`),
  KEY `host` (`host`),
  KEY `program` (`program`),
  KEY `datetime` (`datetime`),
  KEY `priority` (`priority`),
  KEY `facility` (`facility`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

linux ~ # cat syslog_table.sql | mysql syslog


Konfiguration syslog-ng

Der Syslog-ng Daemon muss auch noch passend konfiguriert werden.

# /etc/syslog-ng/syslog-ng.conf

options {
        chain_hostnames(off);
        sync(0);
        stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };

destination d_mysql {
          program("/usr/bin/mysql --user=syslogfeeder --password=SuperPassWord syslog" template("INSERT INTO logs (host, facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n")
          template-escape(yes)); };

destination messages { file("/var/log/messages"); };

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

Andere Guides, HowTos und Anleitungen arbeiten hier mit einer Pipe und einem Program Teil. Teilweise werden noch externe Programme verwendet, die die Ausgabe aus einer Pipe lesen und in die Datenbank schreiben. Die Frage ist, wer hat hier von wem abgeschrieben. Es gibt keinen Grund, warum man nicht direkt in den MySQL Client per program schreiben soll. Das hier ist die elegante und schnellste Lösung! Auch entstehen bei dieser Lösung weniger bis gar keine "syslog-ng[1234]: STATS: dropped 31" Meldungen. Diese Entstehen, wenn gleichzeitig program und pipe in einem Destination stehen.

Mittels der program Zeile wird die Verbindung zur Datenbank aufgebaut, das Template erzeugt die passenden SQL-Befehle (INSERT...) und schickt diese direkt an den MySQL Client.

Betrachtet man sich das ganze mal schrittweise.

  • Die Syslog Meldung kommt rein (source(src))
  • mittels des destination(d_mysql) wird dann ...
    • "INSERT INTO logs (host...." erzeugt und in die Datenbank per mysql Befehl eingelesen.

Vorsicht mit Syslog 1.6.2.x Versionen, hier gibt es einen Fehler im program Destination. (Vergleiche hierzu http://osdir.com/ml/syslog-ng/2004-03/msg00070.html )

Logging weiterer Server

Da nun das Prinzip klar ist und das System funktioniert, sollte an das System Meldungen anderer Systeme entgegennehmen und auch mit in die Datenbank schreiben. Dazu sind nur wenige Änderungen an der syslog-ng.conf Datei notwendig.

# /etc/syslog-ng/syslog-ng.conf

options {
        chain_hostnames(off);
        sync(0);
        stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };
source src_remote { tcp(ip("192.168.1.10") port(514) max-connections(20)); };

destination d_mysql {
          program("/usr/bin/mysql --user=syslogfeeder --password=FeedMe syslog" template("INSERT INTO logs (host, facility, priority, level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n")
          template-escape(yes)); };

destination messages { file("/var/log/messages"); };

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

Die Zeile mit src_remote muss für das entsprechende System angepasst werden. Hier steht die IP-Adresse auf der syslog-Meldungen empfangen werden sollen. Auf diese IP-Adresse und diesen Port muss dann der Syslog-Client die Meldungen schicken.

# /etc/syslog-ng/syslog-ng.conf
#
# Client Version

options {
        chain_hostnames(off);
        sync(0);
        stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };

destination messages { file("/var/log/messages"); };
destination remote { tcp("192.168.1.10" port (514)); };

log { source(src); destination(messages); destination(remote);};

Hier ist die Zeile "destination remote" die wichtige. Hier steht das gleiche wie weiter oben, jedoch hier als destination und oben in der Server Konfiguration als source.

Web GUI - PHPSYSLOGNG

Nun kann man leicht und einfach sich Fehlermeldungen aus der MySQL Datenbank herauslesen und filtern mittels SQL-Befehlen.

Deutlich leichter und komfortabler geht das ganze mit "phpsyslogng".

linux ~ # emerge -pv phpsyslogng

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   N   ] app-admin/phpsyslogng-2.8-r1  USE="mysql -vhosts"

linux ~ # emerge phpsyslogng

Nun sind noch ein paar wenige Handgriffe notwendig. Die Datei /usr/share/doc/phpsyslogng-2.8-r1/dbsetup.sql.gz muss entpackt werden, angepasst und in die Datenbank importiert werden.

linux ~ # zcat /usr/share/doc/phpsyslogng-2.8-r1/dbsetup.sql.gz > dbsetup.sql
linux ~ # # Datei dbsetup.sql mit Editor anpassen

Anzupassen in der Datei sind die Passwörter der Benutzer. Diese sind folgenden Zeilen in der dbsetup.sql enthalten (PW_HERE). Wenn Sie bereits den obigen Zeil implementiert hatten, dann bitte das gleiche Passwort für den syslogfeeder verwenden wie vorher. Dann muss die syslog-ng.conf Datei nicht mehr angepasst werden.

[...]
# create users
INSERT INTO user (Host, User, Password) VALUES ('localhost','sysloguser', password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','sysloguser');

INSERT INTO user (Host, User, Password) VALUES ('localhost','syslogfeeder', password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogfeeder');

INSERT INTO user (Host, User, Password) VALUES ('localhost','syslogadmin',password('PW_HERE'));
INSERT INTO db (Host, Db, User) VALUES ('localhost','syslog','syslogadmin');
[...]

linux ~ # mysqladmin drop syslog
linux ~ # mysql --user=root -p < dbsetup.sql

Nun muss noch die Datei /var/www/localhost/htdocs/phpsyslogng/config/config.php angepaßt werden. In der Datei müssen die Passwörter passend zu der dbsetup.sql Datei gesetzt werden in folgenden Zeilen.

[...]
//========================================================================
// BEGIN: DATABASE CONNECTION INFO
//========================================================================
// DBUSER is the name of the basic user.
define('DBUSER', 'sysloguser');

// DBUSERPW is DBUSER's database password.
define('DBUSERPW', 'PW_HERE');

// DBADMIN is the name of the admin user.
define('DBADMIN', 'syslogadmin');

// DBADMINPW is DBADMIN's database password.
define('DBADMINPW', 'PW_HERE');

// DBNAME is the name of the database you are using.
define('DBNAME', 'syslog');

// DBHOST is the host where the MySQL server is running.
define('DBHOST', 'localhost');

// DBPORT is the port where the MySQL server is listening.
// The default port is 3306.
define('DBPORT', '3306');
[...]

phpsyslogng2

Kommentare 

 
0 #1 RE: Syslog-NG in MySQL loggen (Zentraler Syslog-NG Server) UpdatedMichael Baecker 2010-01-14 10:25
Ein Gewisser "Sirtl" hatte eine Anfrage über das Kontakt Formular gestellt, aber leider vergessen seine E-Mail-Adresse zu hinterlassen

Wofür ist die Option "stats(43200);" ?

Alle 43200 Sekunden wird in die messages Datei, bzw. in die Datenbank eine Statusmeldung des syslog-ng Dämons geschrieben mit statistischen internen Werten. Aus welcher Richtung kamen wieviele Meldungen, und wohin ginen wieviele Meldungen.
Zitieren
 

Kommentar schreiben


Sicherheitscode
Aktualisieren

Copyright © 2010 baecker.com. Alle Rechte vorbehalten.
Joomla! ist freie, unter der GNU/GPL-Lizenz veröffentlichte Software.