Syslog-ng, Logfile mit nur einem Eintrag

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
mjs
Beiträge: 5
Registriert: 10.07.2006 14:05:18

Syslog-ng, Logfile mit nur einem Eintrag

Beitrag von mjs » 10.07.2006 14:11:45

Hallo Leute,

ich habe eine Frage zu dem neuen Syslog-Daemon "Syslog-NG".

Ich verwende ihn in einem neuen Projekt und muss hier ein neues seperates Logfile erzeugen. Das funktioniert auch soweit ganz gut.

Jedoch soll in dieses Logfile immer nur ein Eintarg drinnen stehen. Es werden Meldungen von einem IDS an den Server geschickt, er erkennt die externe Ressource und schreibt ein Logeintrag mit einem Template versehen in ein neues File. Das funktioniert auch sowiet.
Nur hätte ich gerne, dass immer nur ein Eintrag im Log steht und zwar der aktuellste. Sobald ein neuer Event auftritt, soll der allte Eintrag rausgelöscht werden und nur der aktuelle soll im Log stehen bleiben. Ein Skript prüft in einer Endlosscheife das Logfile und meldet den Inhalt weiter.

Ich hoffe Ihr könnte mit helfen.

Vielen Dank schon mal und Gruss,
Matthias

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 10.07.2006 14:15:49

Das hört sich nicht nach einer sauberen Lösung an in meinen Ohren. Kannst du nicht vom syslog direkt an das script übergeben?

jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

mjs
Beiträge: 5
Registriert: 10.07.2006 14:05:18

Beitrag von mjs » 10.07.2006 14:20:26

Das Problem ist folgendes, ich möchte die Meldungen vom IDS an Nagios weitergeben. Da habe ich auch ein Skript im Nagios-Buch gefunden. Aber das funktioniert leider nicht unter Debian und ich hab keine Ahnung warum.

Hier das Skript

Code: Alles auswählen

#!/bin/bash
while read -r line; do
       echo $line | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' \
               -c /etc/send_nsca.cfg \
               1>/var/log/nagios/send_syslog.log 2>&1
done
Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 10.07.2006 21:24:55

Bekommt das Programm denn überhaupt eine Eingabe?

Code: Alles auswählen

#!/bin/bash
while read -r line; do
echo $line
done
kann das Programm etwas versenden?

Code: Alles auswählen

#!/bin/bash
echo Laberrabarber | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' \
-c /etc/send_nsca.cfg \
1>/var/log/nagios/send_syslog.log 2>&1
done
Zu deiner Frage:
lass den syslogd in ein FIFO schreiben, den Du dann endlos in dein readline-script "cattest":

Code: Alles auswählen

mkfifo /var/log/FIFO
in syslog.conf: IDS-Quelle mit FIFO verbinden
while true do; cat /var/log/FIFO | Dein-readline-Skript ;done
Obwohl syslog-ng vermutlich auch direkt an /usr/sbin/send_nsca übergeben kann.


EDIT:sorry, Semikolon ";" falsch gesetzt, so ist's besser:

Code: Alles auswählen

while true; do cat /var/log/FIFO | Dein-readline-Skript ;done
Zuletzt geändert von rendegast am 12.07.2006 20:21:32, insgesamt 1-mal geändert.

mjs
Beiträge: 5
Registriert: 10.07.2006 14:05:18

Beitrag von mjs » 12.07.2006 16:01:48

Ich werde mal das mit Syslog und FIFO mal versuchen.

Danle für deine Hilfe.

Gruss
Matthias

mjs
Beiträge: 5
Registriert: 10.07.2006 14:05:18

Beitrag von mjs » 26.07.2006 11:47:15

Ich habe mal versucht, mein Skript nach euren Vorgaben zu definieren, aber leider habe ich noch Schwierigkeiten. Bin nicht der Skript-Schreiber.

Wie muss ich das Skript aufbauen ?
So geht es leider nicht.

Code: Alles auswählen

#!/bin/bash

while true; do cat /var/log/nagios/FIFO | "read -r line" \ 
"echo $line" | /usr/sbin/send_nsca  -H 10.227.100.15 -p 5667 -d ';' c /etc/send_nsca.cfg; done
Vielen Dank für Eure Hilfe.

Matze

Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 26.07.2006 15:50:41

while true; do cat /var/log/nagios/FIFO | "read -r line" \
"echo $line" | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' c /etc/send_nsca.cfg; done
der Teil ab "read" entspricht nicht dem, was Du als Readline-Script gepostet hast:

Code: Alles auswählen

while read -r line; do
echo $line | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' \
-c /etc/send_nsca.cfg \
1>/var/log/nagios/send_syslog.log 2>&1
done
es fehlt das "-" bei "-c /etc...."; Deine while-Schleife fehlt.


Der Vorschlag von mir

Code: Alles auswählen

while true; do cat /var/log/FIFO | Dein-readline-Skript ;done
soll Dein-readline-Script mit Namen aufrufen.
Die while-Schleife hier ist nur dazu da, am FIFO zu warten, ob etwas neues an Dein Readline-Skript zu übergeben ist. Dieses wird dann innerhalb Deiner while-Schleife an 'send_nsca' übergeben.
EDIT: solange, bis alle Zeilen des FIFO-"Pakets" abgearbeitet sind.
EDIT: Ist bei Deiner Version (falls das mit "-c" nur ein Cut+Paste-Fehler ist) nur die erste Zeile der Meldung weitergegeben worden?

Wenn Du beides in einem Script schreiben willst, müssten dann zwei while-Schleifen auftauchen:

Code: Alles auswählen

#!/bin/bash
while true; do
cat /var/log/FIFO | while read -r line; do
echo $line | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' -c /etc/send_nsca.cfg \
1>/var/log/nagios/send_syslog.log 2>&1
done
done
Etwas übersichtlicher mit einer Funktion:

Code: Alles auswählen

#!/bin/bash

function DEIN-TEIL () {
while read -r line; do
echo $line | /usr/sbin/send_nsca -H 10.227.100.15 -p 5667 -d ';' -c /etc/send_nsca.cfg \
1>/var/log/nagios/send_syslog.log 2>&1
done
}

while true; do
cat /var/log/FIFO | DEIN-TEIL
done
Zuletzt geändert von rendegast am 27.07.2006 15:59:28, insgesamt 1-mal geändert.

mjs
Beiträge: 5
Registriert: 10.07.2006 14:05:18

Beitrag von mjs » 27.07.2006 11:44:23

Danke für deine Idee und Hilfe.

Ich habe das Skript nach deinen Vorgaben umgestzt, aber leider klappt es nicht.
Wenn ich ein cat /var/log/nagios/FIFO mache, sehe ich die kommenden Einträge. Doch er übergibt nichts. Deshalb habe ich das Skript wie folgt geändert und versuche die Logeinträge in ein neues File einzutragen. Das geht leider nicht.

Ich vermuste, dass bei dem Read-Line iregend etwas schief geht.
Muss ich unter Debian für die Read-Line-Anweisung noch irgend eine Erweiterung installieren ?
Hab ich irgend etwas vergessen ?

Code: Alles auswählen

#!/bin/bash
while true; do
        cat /var/log/nagios/FIFO | while read -r line; do
                echo $line > /blubb
        done
done
Gruss
Matthias

Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 27.07.2006 15:50:20

in der Form
...
echo $line > /blubb
...
überschreibt jede neue Zeile die Datei.
Mit Doppelpfeil

Code: Alles auswählen

...
                echo $line >> /blubb
...
wird jedoch angefügt und alles taucht in der Datei auf.
Hier habe ich mit dieser Änderung getestet, und bei

Code: Alles auswählen

cat irgendein.txt > FIFO
taucht dann der komplette Text in blubb auf.

Allerdings gilt dies jetzt nur für diesen Testfall des Schreibens in eine Datei,
Die Form der Pipe in Deinem Ursprungsscript sollte das nicht berühren:

Code: Alles auswählen

...
echo $line | /usr/sbin/send_nsca ...
...
Duch die "while read"-Schleife wird jede Zeile einzeln als Eingabe über die Pipe an /usr/sbin/send_nsca übergeben, welches es dann weiterleitet.

Antworten