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
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
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?
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
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?
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.
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 ?
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
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!
Super Danke f den Hinweis, hab das Skript angepasst!
Beitrag erstellt von Bernhard