• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Event in einem Logfile abgreifen und an Growl schicken?

  • Ersteller Ersteller stk
  • Erstellt am Erstellt am

stk

Grünapfel
Registriert
05.01.04
Beiträge
7.141
Moin,

grundsätzlich hab ich schon klar, das sed, awk, tail, grep ggf. auch perl die richtigen Stationen sind, mit denen ich mich auseinander zu setzen habe, scheitere jedoch kläglich an dieser Shellaufgabe:

Ich würde gerne ein logfile auf das Auftreten eines bestimmten Events überwachen. Es ist also kein »historischer« File, der festgemauert im Dateisystem geschlossen in der Ecke liegt, sondern der laufend von seinem Prozess betankt wird. Der Eintrag - wenn er denn vorbeikommt - kann eindeutig über einen regulären Ausdruck bestimmt werden, wobei der variable Teil auch der ist, der anschliessend in die Ausgabe übernommen werden soll.

Sprich: das Auffinden wäre mit einem Ausdruck wie
Code:
"fixer Text voran "(.*?)" fixer Text hintennach"
zu lösen. Die Ausgabe wiederum soll über growlnotify bereitgestellt werden, also etwa
Code:
growlnotify -m "anderer fixer Text voran "\1" anderer fixer Text hinten nach"

Für sachdienliche Hinweise zur Lösung der Aufgabe wird Euch mein Dank ewig nachschleichen.

Gruß Stefan
 
Es gibt für Perl das Modul File::Tail. Damit sollte es klappen. Die Datei halt in Perl öffnen und mittels regex die Zeile untersuchen. Wenn der Ausdruck vorkommt, solltest du mittels Systemaufruf den String an growl weiterleiten können.
 
Hi,

tail -f /path/to/file | while read line; do

# dein kram hier

echo $line;

done
Kannste ganz leicht testen:

Zwei Shells, erste Shell:

$ echo test > testfile
$
zweite Shell:

$ tail -f testfile | while read line; do echo $line; done
test
erste Shell:

$ echo test > testfile
$
$ echo bleh >> testfile
$
zweite Shell:

$ tail -f testfile | while read line; do echo $line; done
test
bleh

Einziger Haken:

Der Kram muss mit ner Newline gelogged werden. Keine Newline, kein "Event".

Aber das sollte es jetzt echt nicht sein :)

cu
 
Moin,

ah - das schaut doch schon mal ganz gut aus! An welcher Ecke muß ich da noch den grep reinhängen um nur bestimmte Zeilen geliefert zu bekommen?

Gruß Stefan
 
Hi,

Code:
tail -f /path/to/file | while read line; do 
 
[ $( echo $line | grep -e '.*really.*nasty.*regex.*here.*') ] && echo found
 
done
oder die "Lang-version":

Code:
#!/bin/bash

tail -f /path/to/file | while read line; do

echo $line | grep -e '.*really.*nasty.*' &> /dev/null

    if [ $? ]; then

         echo gugsstu
    
    fi

done
Was NICHT geht:

Code:
tail -f /path/to/file | grep -e '.*really.*nasty.*' | ....
Da gibts das Problem das es gerne im Puffer irgendwo hängen bleibt bis grep den Kram dann irgendwann mal wieder wegschreibt weil selbiger voll ist. Es kann also durchaus sein das es nicht "zeitnah" geschieht.

cu
 
  • Like
Reaktionen: stk und fyysh