Sep/077
Syslog-NG + phpSyslog-NG + MySQL
Ich habe einen Syslog-Server mit einem Syslog-NG Server laufen. Dieser Server empfängt brav Logs von entfernten Servern, Routern und sonstigen Geräten im Netz. Im Hintergrund werden die empfangenen Logs unter anderem an eine MySQL-Datenbank weiter geleitet. Syslog-NG schreibt die Informationen in eine Pipe, ein MySQL-Prozess zieht sich die Daten aus dieser Pipe und speichert sie ab. Aufgesetzt ist dieses System nach einem Howto im deutschen Nagios-Wiki (Artikel). Der MySQL-Prozess, der die Datenbank mit den Informationen aus der Pipe befüllt wird durch ein seperates Init-Script gesteuert.
Es passierte hin und wieder mal, dass sich der MySQL-Prozess erhängt oder in Luft aufgelößt hat. Leider bin ich der Ursache des Problems nicht auf die Schliche gekommen. Durch Zufall hat sich mir aber eine andere Lösung aufgetan: Syslog-NG kann den MySQL-Prozess selbst steuern.
Ergänzt man folgende Zeile in der Destination d_mysql in der syslog-ng.conf:
program("/usr/bin/mysql --user=syslogfeeder --password='' syslog > /var/syslog-ng-mysql.pipe");
Das Ergebnis sollte dann in etwa so aussehen:
1 2 3 4 5 6 7 | destination d_mysql { program("/usr/bin/mysql --user=syslogfeeder --password='' syslog > /var/syslog-ng-mysql.pipe"); pipe("/var/syslog-ng-mysql.pipe" 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)); }; |
Jetzt kann man das Init-Script /etc/init.d/sqlsyslogd für den “sqlsyslog Daemon” entfernen, da der MySQL-Prozess jetzt durch Syslog-NG gesteuert wird.
Seit der Umstellung vor einigen Wochen läuft der Dienst durch – eine Sorge weniger.








21:54 on October 26th, 2007
Eine Frage zu dieser Loesung warum machst Du nicht gleich sowas hier :
destination d_mysql {
program(“/usr/bin/mysql –user=syslogfeeder –password=” 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));
};
?
Gunnar
11:25 on October 28th, 2007
Hi Gunnar,
der Befehl innerhalb von program() wird afaik nur einmalig beim Start von Syslog-NG aufgerufen, nicht bei jedem Match, wenn ein Logeintrag verarbeitet werden muss.
Die Verschachtelung der beiden Syslog-NG Parameter program() und template() wird denke ich so nicht funktionieren.
Grüße,
lars
21:38 on November 20th, 2007
Hallo LaMi,
doch es funktioniert. Wir haben seid laengerem eineUmgebungen mit syslog-ng und mysql implementiert.
So wie es die halbe Welt empfielt und einsetzt mit der pipe.
Juengst kam eine weiter hinzu, die Leute welche die erste aufsetzten machten dies auch fuer die zweite.
Dabei kam es zu Problemen und ich wurde gebeten mal draufzuschauen dabei viel mir der umstaendliche Weg auf.
Ich wunderte mich wieso man nicht program nutzte.
Also wurde das getestet und es laeuft performant und fehlerfrei.
Mitlerweile haben wir einen Verdacht wie es zu der umstaendlichen Loesung kam.
Es gab einmal einen Bug im syslog-ng welcher dem Ergebnis des Template zumindest bei program noch ein Prefix spendierte.
Das fleissige Kopieren der daraus entstandenen Loesung ohne nach dem Sinn zu fragen und die Veroeffentlichungen von zahllosen Kopien fuehrte dann wohl zu der Verbreitung.
Gunnar
21:45 on November 20th, 2007
PS:
Ich habe hier auf der Seite auch nur desshalb gefragt weil ich ergruenden wollte warum die halbe Welt den Pipe-Weg nutzt.
Vieleicht ist der program weg ja fuer arge Probleme bekannt.
Und wenn nicht wie kam es zu der immensen Verbreitung diser einen nicht ganz optimalen Loesung.
Diese Fragen haben sich aber inzwischen fuer mich geklaert.
Gunnar
21:59 on November 20th, 2007
Hi Gunnar,
mit der Pipe hast du vermutlich Recht.
Deinen Tipp aus dem ersten Post werde ich bei Zeiten auch ausprobieren, danke für die Anmerkung.
23:10 on December 6th, 2007
hallo Lars,
einer meiner Kollegen hat inzwischen eine mail aus dem php-syslog-ng projekt bekommen, Sie haben es auch angepasst.
Gunnar
PS: und falls auch G.H. dies liest, schreib an gg auf dj9717 in de.
12:28 on January 4th, 2008
also der bug war bei mir in der Version Syslog-ng 1.6.2, daher lief die Methode ohne Pipe nicht. Habe jetzt Version 1.6.5 und alles läuft bestens.