Zabbix Meldungen im Syslog zaehlen

Ein Zählerscript

Speichern Sie folgendes Script in der Datei /usr/local/bin/syslog_counter.pl und machen Sie es mit chmod +x ausführbar.

#!/usr/bin/perl
use IO::File;
use Fcntl qw(:flock);
use warnings;
$counter_file = "/tmp/syslog.count.".$ARGV[0];
$f = new IO::File($counter_file, O_RDWR|O_CREAT) or die("Can not open $counter_file\n");
flock($f,LOCK_EX) or die("Can not lock $counter_file\n");
$c = <$f>;
$c++;
seek($f,0,0);
print $f $c;
flock($f,LOCK_UN);
close ($f);

Testen Sie das Script, in dem Sie es ein paar Mal aufrufen.

/usr/local/bin/syslog_counter.pl test

Sie sollten nun die Datei /tmp/syslog.count.test vorfinden, die die Anzahl der Aufrufe enthält.

Mit Rsyslog zählen

Legen Sie die Datei /etc/rsyslog.d/counter.conf an.

# Count all messages containing 'nada' to counter file /tmp/syslog.count.nada
$template nada,"nada"
:msg, contains, "nada" ^/usr/local/bin/syslog_counter.pl;nada

# Count all messages containing 'gaga' to counter file /tmp/syslog.count.yomama
$template yomama,"yomama"
:msg, contains, "gaga" ^/usr/local/bin/syslog_counter.pl;yomama

Starten Sie rsyslog neu.

Sie benötige jeweils zwei Zeilen in der Rsyslog-Konfiguration. Die erste definiert ein Template, welches die Datei bestimmt, in der der Zähler angelegt wird. Die zweite Zeile ruft das Zählscript auf, und hängt den im Template definierten String als ersten Parameter an.

Diese zwei Schritte sind notwendig, weil rsyslog per Standard immer die gesamte Logmeldung als ersten Parameter an das Sript anhängt. Da wir diese Meldung nicht auswerten wollen, definieren wir ein Template, welches den in Hochkommas enthaltenen String anstatt der Logmeldung zurück gibt.

Rsyslog filtert doppelte Einträge in den Logfiles raus. Das bedeutet, wenn sich Meldungen wiederholen, dann werden nicht alle Vorkommen der Meldung vom Zählerscript gezählt.

Verantwortlich für das Filtern der doppelten Einträge ist folgende Direktive in der Datei /etc/rsyslog.conf:

# Filter duplicated messages
$RepeatedMsgReduction on

Wenn Sie alle Meldungen zählen, aber doppelte Einträge nicht in die Logfiles schreiben möchten, dann sorgen Sie dafür, dass die Aufrufe der Zählerscripte vor der Unterdrückung der doppelten Meldungen erfolgt.