Log Überprüfung

  • Hallo Zusammen,

    Ich bin noch recht neu was das Programmieren angeht und habe eine Frage:

    Ich brauche eine Log überprüfung für eine Log Datei, das sollte so aussehn, das er immer die letzte Zeile der Logdatei ließt und wenn eine bestimmter Wert in der Zeile auftaucht, er das programm neustarten soll.

    Ich habe schon die Filereadline Funktion gesehn, bloß weiß ich nicht recht wie/wo man die gesuchte variable dort angibt... also bei welchem wert er den Neustart "Triggern" soll...

    kann mir dort jemand helfen?

  • Kannst Du uns ein Beispiel für eine Zeile aus der Log-Datei geben und welcher Inhalt genau den Trigger triggern soll?
    Das mit dem Lesen der letzten Zeile hast Du mit "FileReadLine("filename", -1)" hingekriegt?

  • ich suche danach schon länger danach ... "hingekriegt" ist vllt das falsche wort ... ich hab sie hingeschrieben und nicht so recht gewusst was ich damit anfangen soll, wenn er nicht weiß was er da genau lesen soll... außerdem sollte das möglichst im Hintergrund ablaufen...

    11/27 18:35:01 [E]> "Variable Nummer" does not match the expected the checksum of "Variable Nummer"

  • Den vorigen Beitrag habe ich jetzt nicht ganz verstanden :wacko:
    Du willst aus einer Datei die letzte Zeile lesen und wenn in dieser Zeile irgendwo ein bestimmter Wert steht, dann passiert was.
    Damit dieses Programm nicht die ganze CPU lahmlegt, muss ein SLEEP eingebaut werden. Dann hast Du aber das Problem, dass während der Wartezeit vielleicht mehr als eine Zeile an das Ende der Log-Datei angefügt wurde.
    Fein wäre, wenn wir ein Muster einer solchen Log-Zeile bekommen könnten. Dann liesse sich Dir schon einfacher helfen.

  • Grob könnte das [angepasste] Script so aussehen:

    [autoit]

    HotKeySet("+!q", "Quit") ; HotKey to end the script Ctrl+Alt+Q
    $hFile = FileOpen("Deine Log-Datei", 0)
    While 1
    $sLogEntry = FileRead($hFile, -1)
    $aLogEntry = StringSplit($sLogEntry, '"')
    If $aLogEntry[2] = "6766792" Then ; In $aLogEntry[4] steht dann der zweite Variable Wert
    MsgBox(0, "", "Wert gefunden!")
    EndIf
    Sleep(2000) ; 2 Sekunden Pause
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Quit()
    Exit 0
    EndFunc ;==>Quit

    [/autoit]
  • das oben war doch ein muster

    "Variable Nummer" sagt nur aus das dort mehrere nummern stehen können, wenn eine nummer wie "6766792" erscheint soll er neustarten.

    wie füge ich dort, mehrere mögliche Trigger ein?

  • Sorry, da habe ich gepennt :whistling:
    Ich passe das Musterskript in meinem vorigen Beitrag entsprechend an.

    Fertig.
    Das Skript läuft in einer ewigen Schleife bis Du es mit Strg+Alt+q beendest.
    Es liest jeweils den letzten Satz der Logdatei. Falls ein gewünschter Variabler Wert gefunden wird, wird die Msgbox angezeigt.
    Dann wartet es zwei Sekunden und liest wieder die letzte Zeile der Log-Datei usw. usw.

    Was ich mir nicht sicher bin ist, ob Änderungen an der Logdatei so erkannt werden oder ob er immer wieder den selben Satz liest. Dieses Problem könnte aber behoben werden, wenn statt des Handles der komplette Dateiname angegeben wird.

    Da das Skript 2 Sekunden wartet und dann erst den letzten Satz aus der Log-Datei liest; was soll passieren, wenn in dieser Zeit mehr als ein Satz in die LogDatei geschrieben wird? Ist das ein Problem oder soll das Skript versuchen bis zum letzten verarbeiteten Satz zurückzulesen damit keine Eintragungen übersehen werden?

  • Hi,

    der Beitrag von Water erfüllt Deine Anforderungen.

    1) Ändere
    If StringinStr($sLogEntry,"Dein Trigger-Text") > 0 Then
    zu
    If StringinStr($sLogEntry,"6766792") > 0 Then

    2) Wenn Dein Programm wirklich neustarten soll, dann fügst Du in der If Bedingung
    Run (@ScriptDir & "\meine.exe")
    Quit ()
    ein ( Waters Trigger Code).

    Ansonsten läuft die Abfrage des LogFiles in einer Endlos Schleife, also genügt gffs ein Funktionsaufruf anstatt eines Restarts aus.

    ;-))
    Stefan

  • Sorry, da habe ich gepennt :whistling:
    Ich passe das Musterskript in meinem vorigen Beitrag entsprechend an.

    Fertig.
    Das Skript läuft in einer ewigen Schleife bis Du es mit Strg+Alt+q beendest.
    Es liest jeweils den letzten Satz der Logdatei. Falls ein gewünschter Variabler Wert gefunden wird, wird die Msgbox angezeigt.
    Dann wartet es zwei Sekunden und liest wieder die letzte Zeile der Log-Datei usw. usw.

    Was ich mir nicht sicher bin ist, ob Änderungen an der Logdatei so erkannt werden oder ob er immer wieder den selben Satz liest. Dieses Problem könnte aber behoben werden, wenn statt des Handles der komplette Dateiname angegeben wird.

    Da das Skript 2 Sekunden wartet und dann erst den letzten Satz aus der Log-Datei liest; was soll passieren, wenn in dieser Zeit mehr als ein Satz in die LogDatei geschrieben wird? Ist das ein Problem oder soll das Skript versuchen bis zum letzten verarbeiteten Satz zurückzulesen damit keine Eintragungen übersehen werden?

    das ist keine Reine Error Log, Sondern eine Komplette log datei wo die errors auch mit drinnen stehn.

    ich habs nun angepasst zum testen, und er macht leider garnichts.


    in der neuen Version von dir kommt nur ein Error: "Array variable has incorrect number of subscribts or subscript dimension range exceeded."
    1234 nur weil ich keinen error auf knopfdurck fabrizieren kann ;)


    [autoit]

    HotKeySet("+!q", "Quit") ; HotKey to end the script Ctrl+Alt+Q
    $hFile = FileOpen("Events.txt", 0)
    While 1
    $sLogEntry = FileRead($hFile, -1)
    $aLogEntry = StringSplit($sLogEntry, '"')
    If $aLogEntry[2] = "1234" Then
    MsgBox(0, "", "Wert gefunden!")
    EndIf
    Sleep(2000) ; 2 Sekunden Pause
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Quit()
    Exit 0
    EndFunc ;==>Quit

    [/autoit]

    eine Idee von mir wäre bei einem Error die LOg Datei zu löschen(bzw den inhalt), damit er nicht mehrmals versucht neu zu starten.
    und Extern eine andere datei schreiben zu lassen die Protokolliert wann autoit neugestartet hat....

    Einmal editiert, zuletzt von Undertow (1. Dezember 2009 um 14:31)

  • Das Problem tritt auf, wenn er eine Zeile ohne Anführungszeichen verarbeitet. Hier der korrigierte Code:

    [autoit]

    HotKeySet("+!q", "Quit") ; HotKey to end the script Shift+Alt+Q
    $hFile = FileOpen("C:\temp\Log.txt", 0)
    While 1
    $sLogEntry = FileReadLine($hFile, -1)
    $aLogEntry = StringSplit($sLogEntry, '"')
    If @error = 0 Then
    If $aLogEntry[2] = "6766792" Then ; In $aLogEntry[4] steht dann der zweite Variable Wert
    MsgBox(0, "", "Wert gefunden!")
    EndIf
    EndIf
    Sleep(2000) ; 2 Sekunden Pause
    ConsoleWrite("Run: " & $sLogEntry & @CRLF)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Quit()
    Exit 0
    EndFunc ;==>Quit

    [/autoit]


    Nun sollte es funktionieren. Habe es sogar getestet :P Sobald eine neue Zeile hinzugefügt wird, wird sie vom Skript erkannt. Aber Vorsicht: Die Zeile darf selbst nicht mit einem @CRLF abschliessen, denn sonst liest das Skript immer eine Leerzeile.

  • bei mir reagiert der leider nicht auf einen Run-Befehl nach dem

    [autoit]

    If $aLogEntry[2] = "6766792" Then ; In $aLogEntry[4] steht dann der zweite Variable Wert

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    komisch :/

  • Was führst Du mit dem run-Befehl aus? Mein Script ist so gedacht, dass es nicht dauernd selbst gestartet werden muss.

  • also

    bei

    [autoit]


    If $aLogEntry[2] = "6766792" Then ; In $aLogEntry[4] steht dann der zweite Variable Wert
    MsgBox(0, "", "Wert gefunden!")

    [/autoit]


    statt der msgBox (die er mir auch nicht anzeigt btw...) eine Exe ausfüht ... zum beispiel

    [autoit]

    If $aLogEntry[2] = "6766792" Then ; In $aLogEntry[4] steht dann der zweite Variable Wert
    Run(("Word.exe")
    EndIf

    [/autoit]
  • Ersetz das mal durch:

    [autoit]

    ShellExecute("WinWord.exe")

    [/autoit]
  • OK. Hier der aktuellste Stand der zusätzlich noch dafür sorgt, dass für eine Zeile der Trigger nur einmal angezogen wird (d.h. Datum/Uhrzeit des Eintrags wird gespeichert und nur bei Änderung spricht der Trigger an).

    [autoit]

    HotKeySet("+!q", "Quit") ; HotKey to end the script Shift+Alt+Q
    $hFile = FileOpen("C:\temp\Log.txt", 0)
    Global $sOldDate = ""
    While 1
    $sLogEntry = FileReadLine($hFile, -1)
    $aLogEntry = StringSplit($sLogEntry, '"')
    If @error = 0 Then
    If $aLogEntry[2] = "6766792" And $sOldDate <> StringLeft($sLogEntry,14) Then ; In $aLogEntry[4] steht dann der zweite Variable Wert
    ShellExecute("WinWord.exe")
    $sOldDate = StringLeft($sLogEntry,14)
    EndIf
    EndIf
    Sleep(2000) ; 2 Sekunden Pause
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Quit()
    Exit 0
    EndFunc ;==>Quit

    [/autoit]
  • Hi,

    da er die MsgBox auch nicht anzeigt, ist zu vermuten, dass er gar nicht in den if zweig kommt.
    Deshalb würde ich im ersten Step nach dem Stringsplit ein

    MsgBox (0,"", $aLogEntry[2]) einfügen.

    Damit siehst Du, ob Dein If Zweig überhaupt abgearbeitet werden kann.

    ;-))
    Stefan

  • Wenn das Skript von Beitrag 10 immer nur den Text auf der Console ausgibt, dann heisst das, dass der StringSPlit nicht erfolgreich war.
    Sind Deine Zahlen tatsaechlich in Anfuehrungszeichen?

  • nein quark... kanns auch mal komplett posten ...

    12/01 12:49:31 [E]> 3669493577 does not match the expected the checksum of 1831881397 for the menu LoginScreen at coordinates (360 ,250 ,370 ,255) and timed out after 20000 milliseconds.
    12/01 12:49:31 [I]> Failed to login #2

    *g* falls das jemand bekannt vorkommt...

    ist einer der error der einen programm start auslösen soll sobald er geschrieben wurde
    so sieht ein output aus... dann schläft der erstmal eine weile ... und bei 12/01 12:54:38 macht er weiter...

  • Was triggert nun genau die Funktion in meinem Beispielscript? Der Text "does not match the expected the checksum" oder der Wert 3669493577?
    Davon hängt dann ab, wie ich das Programm schreiben muss.