Logfile Watchdog Monitor Logfiles überwachen u Aktion setzen

 

mit diesem Tool kannst du Logfiles beliebiger Programme überwachen und Aktionen setzen.
Das Tool durchsucht den Text der Logfiles und führt eine Aktion durch (Rechner neu starten, Dienste neu starten, Programm ausführen, ...)
Die Logfiles, der Suchtext und die Aktionen werden zentral in einer .ini Datei festgelegt. (searcherror.ini)
Die searcherror.ini sollte standardmäßig im selben Ordner wie die log_watchdog.exe liegen. (außer du kompilierst den unten angeführten Quellcode mit einem fixen Pfad neu)
Durchgeführte Aktionen werden in ein Logfile geschrieben.
Die
Das Tool muss einmalig gestartet werden. Für ein automatisches Starten beim Anmelden beispielsweise, kann eine Verknüpfung zur log_watchdog.exe in den Autostartordner gelegt werden. (Verknüpfung deshalb, da die .ini Datei im selben Ordner, wie die log_watchdog.exe liegen soll)

Format für die searcherror.ini:
[LogSektion:hier kann ein belieber Text eingesetzt werden, sollte aber einmalig in der .ini Datei sein]
logfile="(hier der Pfad zum Logfiles, welches überwacht werden soll)"
search="der Suchtext bei dem eine Aktion ausgeführt werden soll"
action="die Aktion die ausgeführt werden soll"

Beispiele für action:
Rechner neu starten: "%SYSTEMROOT%\system32\shutdown.exe -r -f -t 0"
Rechner herunterfahren: "%SYSTEMROOT%\system32\shutdown.exe -s -f -t 0"
z.B. kann mit action auch auf eine Batchdatei verwiesen werden: "c:\batch\starte.cmd"


Beispiel für eine ini Datei (searcherror.ini)

[error0]
logfile="error.log"
search="unable to connect to slave controller"
action="c:\windows\system32\cmd.exe"

[error1]
logfile="C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal\MediaPortal TV Server\log\tv.log"
search="dvb:StopGraph called"
action="c:\restart_tv_und_mediaportal.cmd"

[error2]
logfile="C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal\MediaPortal TV Server\log\tv.log"
search="card not found :Cinergy 1200 DVB-C Tuner"
action="c:\windows\system32\shutdown.exe -r -f -t 0"

[error4]
logfile="C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal\MediaPortal TV Server\log\error.log"
search="SetupTv(1)]: Exception"
action="c:\windows\system32\shutdown.exe -r -f -t 0"

[error5]
logfile="C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Team MediaPortal\MediaPortal TV Server\log\error.log"
search="RemoteControl: Error getting server Instance"
action="c:\windows\system32\shutdown.exe -r -f -t 0"



Achtung Windows Benutzer: die searcherror.ini darf nicht searcherror.ini.txt heißen, ansonsten findet das Skript die ini Datei nicht und es wird folgender Fehler ausgegeben: Error occurred, probably no INI file

Wenn das Tool einen Fehler findet, wird die Datei watch.ini angelegt:
In dieser wird die Position des Suchtextes geschrieben, wird der Suchtext nach dieser Position erneut gefunden, wird die Aktion erneut ausgeführt.

Quellcode (kann angepasst und online auf dieser Seite kompiliert werden)
die Datei beruht auf folgendem Quellcode.
zum anpassen, folgenden Code in den AutoIT Online Compiler geben und neu kompilieren:

#include <file.au3>
#include <GUIConstants.au3>
$logfilewrite="watchdoglog.txt"
_FileWriteLog($logfilewrite, "------------------------------init logfile----------------------------")
$timewait=10000
$inifile="searcherror.ini"
$iniwatch="watch.ini"
$var = IniReadSectionNames($inifile)
If @error Then
    MsgBox(4096, "", "Error occurred, probably no INI file:" & $inifile)
    exit
Else
    For $i = 1 To $var[0]
        $logfile=IniRead ( $inifile, $var[$i], "logfile", "default" )

                        $search=IniRead ( $inifile, $var[$i], "search", "default" )
                        $action=IniRead ( $inifile, $var[$i], "action", "default" )
                        _FileWriteLog($logfilewrite, "started looking in: " & $logfile & "action:" & $action & " found: " & $search)
    Next
EndIf
_FileWriteLog($logfilewrite, "-----------------------------lets start -------------------------------")
While 1

$var = IniReadSectionNames($inifile)
If @error Then
    MsgBox(4096, "", "Error occurred, probably no INI file." & $inifile)
Else
    For $i = 1 To $var[0]
        $logfile=IniRead ( $inifile, $var[$i], "logfile", "default" )
                        $file = FileOpen($logfile, 0)
                        ; Check if file opened for reading OK
                        If $file <> -1 Then
                            ; Read in 1 character at a time until the EOF is reached
                        $line = FileRead($file)
                        $search=IniRead ( $inifile, $var[$i], "search", "default" )
                        $action=IniRead ( $inifile, $var[$i], "action", "default" )
                        $result = StringInStr($line, $search, 1, -1)
                        $lastresult=IniRead ($iniwatch, $var[$i], $action, "1")
                                if $result > $lastresult then                                
                                        IniWrite($iniwatch, $var[$i], $action, $result)
                                        TrayTip("Event " & $action & " in " & $timewait/1000  & " Sekunden", "AutoIT Watchdog " & $logfile & " found: " & $search, 5, 1)
                                        sleep($timewait)
                                        _FileWriteLog($logfilewrite, "action:" & $action & " found: " & $search & " in " & $logfile)
                                        run($action,"",@SW_MINIMIZE)
                                        sleep($timewait*3)
                                        $result=0
                                endif
                                If @error = -1 Then ExitLoop
                        EndIf
                        FileClose($file)
                        sleep(1000)       
    Next
EndIf
Wend

 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
28.03.2021 16:46
Was muss geändert werden wenn ein Ereignis in der log auftaucht, dann aber bis zu einem bestimmten anderen Eintrag gewartet werden soll bevor die Aktion durchgeführt werden soll?

✍anonym
21.05.2014 02:03
User: OtterNas3 
Vielen, vielen, VIELEN Dank!

Hat mir viel me erspart selber was zu schreiben, genau das was ich brauch :)

Funktioniert tadellos und macht was es soll!

Sche gre aus dem Hessen
Otter

✍anonym
05.09.2013 12:22
User: Sascha 
Klappt eigentlich wie es soll jedoch reicht es nicht f meine Anforderungen, denn sobald einmal der "error" im logfile ist und erkannt wird, wird dieser beim neustart des scriptes wieder gelesen und erkannt da der wert im logfile erst viel sper erschrieben wird. kann man das sript irgendwie eingrenzen, damit er nur die aktuellsten zeilen des files list und nicht das was eventuell schon seit tagen da drin steht?

✍anonym
20.06.2013 15:07
User: Mark Swanson 
Super Script hat mir viel Arbeit erspart.
Leider hilft es nicht, wenn das Logfile rotiert.
Sobald der Log geleert wird, ist der Zler in der watch.ini zu gro Ein Ansatz we noch zuszlich die lge der Logdatei zu speichern, wenn die neue Lger kzer ist als die alte, dann auch den Zler in der watch.ini zurksetzen.

✍anonym
21.03.2013 10:07
User: Philipp Holzer 
Ich wollte den Programm mal testen. Es funktioniert auch soweit alles. Leider wird aber die action nicht durchgefrt. Muss ich da irgendwas beachten ?
✍Bernhard
gepostet am 21.03.2013 10:07
die Tasks starten minimiert, z.B. f cmd maximiert kann als action folgendes eingegeben werden: action="c:\windows\system32\cmd.exe /c start cmd.exe" oder das Skript dern und in den Onlinekompiler kopieren:anstelle von run($action,"",@SW_MINIMIZE) aber run($action)

Beitrag erstellt von Bernhard

✍anonym
02.03.2012 12:18
User: Chris Kierspel 
Hey,
  das Skript funktioniert gut, hat aber ein Memory-Leak - der FileClose($file) findet nur statt, wenn im Logfile etwas gefunden wurde - und danach wird das File auch erneut geöffnet. Da FileOpen($logfile,o) in der Schleife läuft werden dauernd neue Handles geöffnet - man kann dies im Taskmanager schön sehen, der Speicherverbraucht steigt und steigt und steigt. 
  Durch das Einfügen von FileClose($file) direkt vor dem sleep(1000) in der 4. letzten Zeile ist das Memory leak Problem gelöst!
✍Bernhard
gepostet am 02.03.2012 12:18
Super Danke f den Hinweis, hab das Skript angepasst!

Beitrag erstellt von Bernhard