PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Befehl ausführen bei bestimmten Ereignis im Logfile



linux-try
30.01.19, 18:59
Hallo,
ich möchte ein Applikations-Logfile überwachen, und wenn ein bestimmtes Event reingeschrieben wird, ein Linux-Befehl (mosquito_pub ...) ausführen lassen.
Gibt es da schon etwas "fertiges" das ich dafür nutzen kann, oder wäre der Ansatz mit: #tail -f FILE | grep SUCHEBEGRIFF ... realisierbar?
Es würde auch eine minütliche Überprüfung genügen, sollte performant sein und den Raspberry nicht zu sehr zusätzlich belasten..

Danke für Tipp und Anregungen!

strcat
30.01.19, 20:45
tail -f FILE | awk '/SUCHBEGRIFF/ { print | "mosquito_pub" }'
Ungetestet.

linux-try
31.01.19, 09:43
tail -f FILE | awk '/SUCHBEGRIFF/ { print | "mosquito_pub" }'

Ich teste das gerade, bekomme aber keinerlei "Zeilen" raus ...

tail -f /tmp/mm.log | awk '/112233/ { print | "echo 1111111111111111111" }'

Sollte dann nicht auf der Shell bei einer "112233", die in das Log geschrieben wird, das echo .... ausgegeben werden?

fork
31.01.19, 10:10
Fail2Ban ist dafür da, Logfiles auf Textmuster zu überwachen bei erreichen der Limits(Bei Dir "1") Befehle auszuführen. Das wäre doch Dein Anwendungsfall?

---

tail -f liest nur hinzukommende Zeilen(-f wie follow(folgen)) und nicht den bestehenden Inhalt.

linux-try
31.01.19, 10:19
(Neu) hinzukommende Muster würde ja reichen, bisherige Einträge können ignoriert werden.
Aber trotzdem klappt es nicht, bei ausführen wird die Aktion (weil in den letzten Zeilen das Muste schon vorhanden ist) ausgeführt, aber nicht mehr be neu hinzukommenden Einträgen die matchen ...

Habe es auch mal: tail -f LOG | grep MUSTER | Befehl
geht auch nicht. Sollte das gehen?

marce
31.01.19, 10:30
Habe es auch mal: tail -f LOG | grep MUSTER | Befehl
geht auch nicht. Sollte das gehen?
Nein, sollte es vermutlich nicht.

Aber mal Butter bei die Fische: Um welche Aplikation geht es denn genau? Wie groß ist das Logfile? Wie zeitkritisch ist das ganze?

(https://www.google.com/search?q=linux+trigger+event+on+log+entry kennt auch ein bisserl was)

linux-try
31.01.19, 10:43
Es geht um die Überwachung eines Logfiles einer Hausautomation, pro Minute sind es etwa 8 Einträge die reingeschrieben werden.
Das zu "suchende" Event tritt etwa 3x pro Tag auf ...

Eine einfache Lösung ohne extra zu installierende Software/Tool wäre gut, in der Art: tail -f ... <was-auch-immer> . Aber das scheint ja doch nicht zu gehen, oder?

Gerade "swatch (https://linux.die.net/man/1/swatch)" gesehen, wäe das eine Möglichkeit für mein "Problem" (falls es diese SW für den Raspberry gibt ...)

corresponder
31.01.19, 11:56
logwatch - In Perl geschriebener Protokollanalyseprogramm mit ansprechender Ausgabe

gruss

marce
31.01.19, 12:19
naja, Logwatch ist AFAIK für Liveanalysen eher "grausam" bis untauglich.

Da sich der TE mit der konkreten Anwendung immer noch bedeckt hält kann man nicht wirklich viel sagen - oftmals kann man dort über Log-Konfigurationen so einiges erledigen, aber dazu müsste man die konkrete Anwendung kennen.

Ob man nun sucht, ob swatch (oder eines der vielen anderen Tools, siehe z.B. auch http://www.linux-magazin.de/ausgaben/2017/04/bitparade/) unter Raspian verfügbar ist - oder kurz einen 4-Zeiler in die Bash klopft bleibt einem dann wohl eher selbst überlassen.

Ein Blick wären evtl. auch noch die Nagios-Plugins wert, da gibt's AFAIK auch ein check_log das dem TE genügen könnte...

linux-try
31.01.19, 13:08
Da sich der TE mit der konkreten Anwendung immer noch bedeckt hält kann man nicht wirklich viel sagen - oftmals kann man dort über Log-Konfigurationen so einiges erledigen, aber dazu müsste man die konkrete Anwendung kennen.
... oder kurz einen 4-Zeiler in die Bash klopft bleibt einem dann wohl eher selbst überlassen.

Es geht um ein Logfile von openHAB, welches ich "überwachen" will.

Mir würde ein 4-Zeiler auch am besten gefallen, aber geht dies denn ? Mit tail -f .... scheint dies ja nicht so umsetzbar zu sein.

marce
31.01.19, 13:44
wenn man sich https://www.openhab.org/docs/administration/logging.html anschaut könnte man das gewünschte Event einfach in ein ded. Logfile schicken - entweder reicht es dann aus zu prüfen, ob die die Anzahl der Einträge oder der Timestamp geändert hat, evtl. kann man auch prüfen als Logfile eine NamedPipe anzugeben und an deren Ende dann einfach einen Job like "wenn was kommt dann mache" (while read line do $script done) anzuflanschen. Ggf. geht auch direktes aufrufen eines Hooks, da bin ich gerade in der Log4j-Thematik zu wenig drin.

Das Ding scheint auch eine Rest-API zu haben - ggf. bekommt man die gewüschten Infos auch da raus.

Zudem gibt es unter Bindings Exec (https://www.openhab.org/addons/bindings/exec/) - sieht für mich auch nach einer potentiellen Lösung aus.

Ein einfacher wenig-Zeiler wäre ggf.

a=$(grep -c $suchstring $logfile)
if "$a" -ne "$(cat $old) then $dosomething ; echo $a > $old

linux-try
31.01.19, 14:06
...
Ein einfacher wenig-Zeiler wäre ggf.

a=$(grep -c $suchstring $logfile)
if "$a" -ne "$(cat $old) then $dosomething ; echo $a > $old

In der Art hatte ich was überlegt, da muss aber noch ein Logswitch beachtet werden ...
Daher wäre ein "dummes" tail -f, der jedesmal "anschlägt", wenn dr Suchstring neu auftritt, besser (aber das geht wohl technisch nicht / Scriptechnisch nicht) :-(

fork
31.01.19, 14:36
while :; do # Endlosschleife, für den Fall dass der tail abbricht (z. B. bei log switch?)
tail -f file.log | grep "suchmuster" | while read line ; do
echo "Suchmuster ist aufgetreten"
fuehre_ein_script_aus
done
sleep 5 # Kurze Wartezeit, nur dass das Script nicht durchdreht, wenn die Logdatei z. B. fehlt, ...
done

marce
31.01.19, 15:15
In der Art hatte ich was überlegt, da muss aber noch ein Logswitch beachtet werden ...(
was im konkreten Fall vermutlich über "... und a!=0" erledigt wäre - bzw. über ein && der beiden Zeilen.

linux-try
31.01.19, 15:18
Hallo Nachbar,



while :; do # Endlosschleife, für den Fall dass der tail abbricht (z. B. bei log switch?)
tail -f file.log | grep "suchmuster" | while read line ; do
echo "Suchmuster ist aufgetreten"
fuehre_ein_script_aus
done
sleep 5 # Kurze Wartezeit, nur dass das Script nicht durchdreht, wenn die Logdatei z. B. fehlt, ...
done


Nur nee Frage, hast du deinen Code auch getestet oder ist das "nur" nee Vermutung das es so gehen könnte/sollte/müsste?
Denn in der Art bin ich schon immer am rum-experementieren, aber ohne Erfolg.
Und auch dein Code (Log und Suchbegriff angepasst!) bringt kein Ergebnis :-(

fork
31.01.19, 15:24
Der Code ist nicht getestet.

Die Pufferung könnte da noch in die Suppe spucken, d. h. die Ausführung verzögern.
Ich meine, dass stdin/stdout/stderr normalerweise zeilengepuffert arbeitet, also sollte
das eigentlich kein Problem sein. Falls doch: mit stdbuf experimentieren.

Das umgeht vollständig die Pufferung für den folgenden Befehl auf stdin/stdout:


stdbuf -i0 -o0 tail file.log | stdbuf -i0 -o0 grep "suchmuster"

corresponder
31.01.19, 15:31
ich meinte den, hab ich vor aeonen mal genutzt, fürn isdnlog, glaub ich.....

https://linuxwiki.de/logsurfer

linux-try
05.02.19, 08:12
Der Code ist nicht getestet.

Die Pufferung könnte da noch in die Suppe spucken, d. h. die Ausführung verzögern.
Ich meine, dass stdin/stdout/stderr normalerweise zeilengepuffert arbeitet, also sollte
das eigentlich kein Problem sein. Falls doch: mit stdbuf experimentieren.

Das umgeht vollständig die Pufferung für den folgenden Befehl auf stdin/stdout:


stdbuf -i0 -o0 tail file.log | stdbuf -i0 -o0 grep "suchmuster"

Läuft seit 4 Tagen, scheint zu funktionieren, thx !!