Offlinelogger --Probleme mit timer / while-Schleife

  • Hey all

    Ich werd es wohl nie begreifen :(

    Ich hab seit längerem Probleme mit meiner Internetverbindung. Deshalb will ich mir einen Timer basteln, der die Ausfälle protokolliert.
    Ich pinge zu diesem Zweck google an und wenn die Verbindung nicht zustande kommt, soll der Timer gestartet werden und wieder beendet werden,
    sobald die Verbindung wieder da ist.

    Zu Testzwecken hab ich das folgende Script gestartet, die Verbindung selber getrennt und nach ner Weile wieder hergestellt.
    Doch nix passiert. Warum klappt das nicht??

    [autoit]

    #region Funktionen für den Nicht-Online-Checker
    Func onlinecheck()
    If Ping("http://www.google.de/") Then
    $timer = 0
    Sleep(2000)
    Else
    $timer = TimerInit()
    While Ping("http://www.google.de/") < 6
    Sleep(1000)
    WEnd
    $timestring = TimerDiff($timer)
    MsgBox(0,"",$timestring)
    EndIf
    EndFunc
    #endregion

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

    While 1
    onlinecheck()
    Sleep(200)
    WEnd

    [/autoit]
  • Was genau heißt "doch nix passiert"?
    Ich persönlich verstehe bloß den Vergleich mit Ping < 6 nicht... Was genau soll das bezwecken? Warum gerade 6?

    So könnte ich es mir jedenfalls vorstellen (nicht getestet):

    [autoit]

    #region Funktionen für den Nicht-Online-Checker
    Func onlinecheck()
    If Ping("http://www.google.de/") Then
    $timer = 0
    Sleep(2000)
    Else
    $timer = TimerInit()
    Do
    Sleep (1000)
    Until Ping("http://www.google.de/")
    $timestring = TimerDiff($timer)
    MsgBox(0,"",$timestring)
    EndIf
    EndFunc
    #endregion

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

    While 1
    onlinecheck()
    Sleep(200)
    WEnd

    [/autoit]
  • das ist wirklich verzwickt ^^ ich lass mir auch mal was einfallen x)))

    Edit: ohh, habe die oberen Post nicht gesehen ^^

    Einmal editiert, zuletzt von Yjuq (22. Juni 2012 um 21:38)

  • np dafür
    trotzdem ist dein Code fehleranfällig, wenn dann so :

    [autoit]

    While Not Ping("www.google.de") ; Zeile 8

    [/autoit]


    Ansonsten, wenn der Ping enorm schnell wäre (6 ms) , würde dein Script nicht funktionieren.

    Und nochmal zu oben.Du prüfst nicht @error, wenn du @error prüfen willst, musst du

    [autoit]

    $iPing = Ping("www.google.de")
    if @error Then ; ...usw

    [/autoit]
  • Ich will an dieser Stelle nur mal anmerken, dass es nicht sehr zuverlässig ist nur Google.de anzupingen. Währe es nicht viel sinnvoller eine Reihe von Webseiten anzupingen? Wenn dann alle Server nicht reagieren kann man sicher davon ausgehen, dass gerade keine Internetverbindung besteht...

    LG
    Christoph :)

  • Hallo, der DAU mal wieder.

    Leider musste ich diesen Thread wieder öffnen.

    Ich habe das Script soweit fertig, jedoch gibt es nun einen erneuten Fehler.
    Während des Testens, unter Anpingens einer Adresse, funktionierte es einwandfrei.
    Nachdem ich mein Script jedoch um 4 weitere Adressen zum Anpingen erweitert habe, wird das Logfile falsch ausgegeben.

    Offlinelogger
    [autoit]

    #include <Date.au3>

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

    Global $file = _NowDate() & ".log"
    Global $pfad = @UserProfileDir & "\Offlinelogs\"
    Global $pfad_total = $pfad & $file
    Global $check, $Hour, $Mins, $Secs
    Global $ping_1 = "www.google.de"
    Global $ping_2 = "www.ifa-clan.de"
    Global $ping_3 = "www.autoit.de"
    Global $ping_4 = "www.web.de"
    Global $ping_5 = "www.gmx.de"

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

    Func onlinecheck()
    While 1
    If Not Ping($ping_1,500) Then
    $check = "error"
    If Not Ping($ping_2,500) Then
    If Not Ping($ping_3,500) Then
    If Not Ping($ping_4,500) Then
    If Not Ping($ping_5,500) Then
    starte_protokoll()
    Else
    $check = "okay"
    ExitLoop
    EndIf
    Else
    $check = "okay"
    ExitLoop
    EndIf
    Else
    $check = "okay"
    ExitLoop
    EndIf
    Else
    $check = "okay"
    ExitLoop
    EndIf
    Else
    $check = "okay"
    ExitLoop
    EndIf
    WEnd
    EndFunc

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

    Func starte_protokoll()
    $timer = TimerInit()
    $startzeit = _NowTime(5)
    If Not FileExists($pfad_total) Then
    $neu = FileOpen($pfad_total,1)
    FileWrite($neu,"[registrierte Ausfälle]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" & @TAB & "0" &@CRLF& "Zeit Total" &@TAB&@TAB& "=" &@CRLF&@CRLF)
    FileWrite($neu,"[gesammelte Ticks]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" & @TAB & "0" &@CRLF&@CRLF)
    FileWrite($neu,"[detailierte Liste]" &@CRLF)
    FileClose($neu)
    EndIf
    Do
    $check = onlinecheck()
    Until $check = "okay"

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

    $ticks = TimerDiff($timer)
    $ist = IniRead($pfad_total,"gesammelte Ticks","Anzahl","0")
    IniWrite($pfad_total,"gesammelte Ticks","Anzahl",@TAB & $ticks + $ist)

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

    _TicksToTime($ticks, $Hour, $Mins, $Secs)
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden keine Verbindung zum Internet" & @TAB & "|- Ticks =" & @TAB & $ticks)
    IniWrite($pfad_total,"detailierte Liste","ab " & $startzeit & @TAB & @TAB, $dauer)

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

    $ist = IniReadSection($pfad_total,"detailierte Liste")
    IniWrite($pfad_total,"registrierte Ausfälle","Anzahl",@TAB & ($ist[0][0]))

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

    $ist = IniRead($pfad_total,"gesammelte Ticks","Anzahl","0")
    _TicksToTime($ist, $Hour, $Mins, $Secs)
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden")
    IniWrite($pfad_total,"registrierte Ausfälle","Zeit Total", $dauer)

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

    $timer = 0
    EndFunc

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

    While 1
    $check = onlinecheck()
    If $check <> "okay" Then starte_protokoll()
    Sleep(5000)
    WEnd

    [/autoit]
    Ausgabe des Logfiles


    Ich habe die Internetverbindung nur 1 mal für ca 10 Minuten getrennt. deshalb sollte in diesem Logfile auch nur 1 Eintrag in der Sektion "detailierte Liste" stehen.
    Das kann doch nur an der Schleife in der Funktion "onlinecheck" sein, oder?

  • hab mir es nicht genau angesehen aber
    du rufst in Zeile 23 starte_protokoll() auf.
    In der rufst du dann wieder onlinecheck () auf.
    Und die ruft wieder staarte_protokoll () auf usw.

  • Hier mal ein etwas anderer Aufbau, der einfachheithalber nur die ausgabe in Form von Sekunden, kann man aber natürlich abändern:


    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    #include <file.au3>

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

    Global $LogFile = @ScriptDir & "\" & _NowDate() & "_" & @HOUR & @MIN & @SEC & ".log"
    Global $aLog[2]=[0,""]
    Global $aPingSites[5] = [ _
    "www.google.de", _
    "www.ifa-clan.de", _
    "www.autoit.de", _
    "www.web.de", _
    "www.gmx.de" _
    ]

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

    Global $lastCheck = -1
    Global $onlineSince = TimerInit()
    Global $offlineSince = TimerInit()
    Global $totalTime = TimerInit()
    Global $checkEvery = 10000 ; alle 10 Sekunden prüfen, würde das eher sogar auf einmal pro Minute setzen
    Global $online = True
    Global $onlineOld = $online

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

    While 1
    If $lastCheck = -1 Or TimerDiff($lastCheck) > $checkEvery Then
    $onlineOld = $online
    $online = onlinecheck()
    if $onlineOld <> $online Then
    If $online = False Then
    ConsoleWrite("Computer war für " & Round(TimerDiff($onlineSince)/1000,0) & " Sekunden online" & @CRLF)
    $offlineSince = TimerInit()
    Else
    ConsoleWrite("Computer war für " & Round(TimerDiff($offlineSince)/1000,0) & " Sekunden offline" & @CRLF)
    ReDim $aLog[UBound($aLog)+1]
    $aLog[0]+=1
    $aLog[UBound($aLog)-1]= _NowCalc() & @TAB & "=" & @TAB & Round(TimerDiff($offlineSince)/1000,0) & " Sekunden keine Verbindung zum Internet"
    $onlineSince = TimerInit()
    EndIf
    EndIf
    $lastCheck = TimerInit()
    $aLog[1]=Round(TimerDiff($totalTime)/1000,0) & " Sekunden"
    writeLog()
    EndIf
    WEnd

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

    Func onlinecheck()
    Local $badPings = 0
    For $i=0 to UBound($aPingSites)-1
    Ping($aPingSites[$i],500)
    if @error Then $badPings+=1
    Next
    ConsoleWrite("negative pings: " & $badPings & @CRLF)
    If $badPings = UBound($aPingSites) Then
    Return False
    Else
    Return True
    EndIf
    EndFunc

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

    Func writeLog()
    Local $data, $hLogFile

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

    If UBound($aLog) < 3 Then Return

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

    if Not FileExists($LogFile) Then _FileCreate($LogFile)

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

    $data = "[registrierte Ausfälle]" & @CRLF & _
    "Anzahl" & @TAB & @TAB & @TAB & "=" & @TAB & $aLog[0] & @CRLF
    $data &= "Zeit Total" & @TAB & @TAB & "=" & @TAB & $aLog[1] & @CRLF & @CRLF & _
    "[detailierte Liste]" & @CRLF
    For $i=2 to UBound($aLog)-1
    $data &= $aLog[$i] & @CRLF
    Next

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

    $hLogFile = FileOpen($LogFile,10)
    FileWrite($hLogFile,$data)
    FileClose($hLogFile)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (24. Juni 2012 um 13:20)

  • Memo an mich selbst:
    Wenn man müde ist sollte man sich nicht durch irgendwelche Schleifen/If-Else-Klauseln arbeiten, sondern ins Nest gehen...

    Habe den Fehler gefunden und den Code umgeschrieben. 3 mal getestet und im Logfile auch genau die Einträge bekommen die es auch sein sollten.
    Für alle, die es interessieren könnte ist hier der fertige Code.

    Offlinelogger v1.01
    [autoit]

    #include <Date.au3>
    #include <file.au3>

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

    Global $ping_1 = "www.google.de"
    Global $ping_2 = "www.ifa-clan.de"
    Global $ping_3 = "www.autoit.de"
    Global $ping_4 = "www.web.de"
    Global $ping_5 = "www.gmx.de"
    Global $basis = @ScriptDir & "\Offlinelogs\"
    Global $pfad = @ScriptDir & "\Offlinelogs\" & _NowDate() & ".log"
    Global $pfad2 = @ScriptDir & "\Offlinelogs\_Auswertung.log"
    Global $Hour, $Mins, $Secs, $liste, $ist, $ist1, $ist2

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

    Func starte_protokoll()
    If Not Ping($ping_1,500) Then ; Wenn das anpingen dieser Webseiten nicht werfolgreich ist,
    If Not Ping($ping_2,500) Then ; wird der Timer initialisiert, denn es ist höchst wahrscheinlich,
    If Not Ping($ping_3,500) Then ; dass die Internetverbindung aus irgend einem Grund nicht vorhanden ist.
    If Not Ping($ping_4,500) Then
    If Not Ping($ping_5,500) Then
    $pfad = @UserProfileDir & "\Offlinelogs\" & _NowDate() & ".log"
    $timer = TimerInit()
    $startzeit = _NowTime(5) ; Zeitpunkt der Initialisierung des Timers für den korrekten Logeintrag speichern.
    If Not FileExists($pfad) Then
    $neu = FileOpen($pfad,1) ; Hier wird das Grundgerüst des Logfiles erstellt, falls nicht vorhanden.
    FileWrite($neu,"[registrierte Ausfälle]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" & @TAB & "0" &@CRLF& "Zeit Total" &@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF& _
    "[gesammelte Ticks]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF& "[detailierte Liste]")
    FileClose($neu)
    EndIf
    If Not FileExists($pfad2) Then
    $neu = FileOpen($pfad2,1) ; Hier wird das Grundgerüst der Zusammenfassung aller betroffenen Tage erstellt, falls nicht vorhanden.
    FileWrite($neu,"[Zusammenfassung]" &@CRLF& "Anzahl betroffener Tage" &@TAB& "=" &@TAB& "0" &@CRLF& "Anzahl der Ausfälle" &@TAB&@TAB& "=" &@TAB& "0" & _
    @CRLF& "Zeit Total" &@TAB&@TAB&@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF&"gesammelte Ticks" &@TAB&@TAB& "=" &@TAB& "0")
    FileClose($neu)
    EndIf
    Do ; Die schleife, die so lange abgearbeitet wird, bis eine der Webseiten wieder erreichbar ist,
    Sleep(250) ; was eine vorhandene Internetverbindung bestätigt.
    Until Ping($ping_1,500) Or Ping($ping_2,500) Or Ping($ping_3,500) Or Ping($ping_4,500) Or Ping($ping_5,500)

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

    $ticks = TimerDiff($timer) ; Beendet den Timer und liest die angesammelten Ticks für die Weiterverwendung aus.
    $ist = IniRead($pfad,"gesammelte Ticks","Anzahl","0") ; Liest die bisher gesammelten Ticks des aktuellen Tages aus und addiert diese
    IniWrite($pfad,"gesammelte Ticks","Anzahl",@TAB & $ticks + $ist) ; mit den neu gesammelten Ticks. Dient der Auflistung der gesammten Ausfallzeit.

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

    _TicksToTime($ticks, $Hour, $Mins, $Secs) ; Konvertiert die aktuellen Ticks in ein vernünftiges Zeitformat und schreibt den Log-Eintrag in den aktuellen Tages-Log.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden keine Verbindung zum Internet" & @TAB & "|- Ticks =" & @TAB & $ticks)
    IniWrite($pfad,"detailierte Liste","ab " & $startzeit & @TAB & @TAB, $dauer)

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

    $ist = IniReadSection($pfad,"detailierte Liste") ; Aktualisiert die Anzahl der
    IniWrite($pfad,"registrierte Ausfälle","Anzahl",@TAB & ($ist[0][0])) ; Ausfälle des aktuellen Tages.

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

    $ist = IniRead($pfad,"gesammelte Ticks","Anzahl","0") ; Liest die gesammten Ticks des aktuellen Tages aus und konvertiert diese zur Niederschrift
    _TicksToTime($ist, $Hour, $Mins, $Secs) ; in ein vernünftiges Zeitformat um die gesammte Ausfallzeit des aktuellen Tages zu bekommen.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden")
    IniWrite($pfad,"registrierte Ausfälle","Zeit Total", $dauer)

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

    $liste = _FileListToArray($basis,"*.*.*.log",1)
    Local $result1 = 0, $result2 = 0
    For $i = 1 to $liste[0]
    $ist1 = IniRead($basis & $liste[$i],"gesammelte Ticks","Anzahl","0") ; Liest alle Ticks der geloggten Tage aus.
    $ist2 = IniRead($basis & $liste[$i],"registrierte Ausfälle","Anzahl","0") ; Liest alle Ausfälle der geloggten Tage aus.
    $result1 = $result1 + $ist1
    $result2 = $result2 + $ist2
    Next
    IniWrite($pfad2,"Zusammenfassung","Anzahl betroffener Tage",@TAB & $liste[0]) ; Aktualisiert die Anzahl pro geloggtem Tag.
    IniWrite($pfad2,"Zusammenfassung","gesammelte Ticks",@TAB & $result1) ; Aktualisiert die Anzahl der Ticks pro geloggtem Tag.
    IniWrite($pfad2,"Zusammenfassung","Anzahl der Ausfälle",@TAB & $result2) ; Aktualisiert die Anzahl der Ausfälle pro geloggtem Tag.

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

    $ist = IniRead($pfad2,"Zusammenfassung","gesammelte Ticks","0") ; Konvertiert die Ticks aller geloggten Ausfälle in ein
    _TicksToTime($ist, $Hour, $Mins, $Secs) ; lesbares Zeitformat zur Niederschrift in der Zusammenfassung.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden")
    IniWrite($pfad2,"Zusammenfassung","Zeit Total", $dauer)
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndFunc

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

    While 1
    starte_protokoll()
    Sleep(2000)
    WEnd

    [/autoit]


    misterspeed:
    Danke für deinen Post. Das ist sicher eine gute Alternative, jedoch werd ich bei meinem Script bleiben.
    Du kannst sicher nachvollziehen, dass wenn man nach ner gefühlten Ewigkeit sein Script endlich so hinbekommen hat, dass es funktioniert wie es soll, man es ungern gegen etwas anderes eintauschen möchte. :)

  • Ich weis, dass Lottich jetzt sein eigenes Script verwendet, aber da ich auch schon eine kürzere Version geschrieben habe, die auch mehr Webserver verwenden kann wollte ich sie euch nicht vorenthalten... :P

    Spoiler anzeigen
    [autoit]

    #include <INet.au3>
    Global $State = False, $Round = TimerInit(), $LogFile = @ScriptDir & '\InternetLogger.ini', $Server[5] = [4, 'www.google.com', 'www.facebook.com', 'www.youtube.com', 'www.yahoo.com'], $Intervall = 1, $Timeout = 4000

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

    While 1
    $Offline = 0
    For $i = 1 To $Server[0]
    If Ping($Server[$i], $Timeout) = 0 Then $Offline += 1
    Next
    If $Offline = $Server[0] Then
    If Not $State Then
    $State = TimerInit()
    IniWrite($LogFile, 'detailierte Liste', @HOUR & ':' & @MIN & ':' & @SEC & @TAB & @MDAY & '/' & @MON & '/' & @YEAR & @TAB, @TAB & 'Offline' & @TAB & 'Internetverbindung verloren!')
    ; wir sind offline...
    EndIf
    Else
    If $State Then
    $OfflineTime = Round(TimerDiff($State), 0)
    $State = False
    IniWrite($LogFile, 'Ausfälle', 'Anzahl', Number(IniRead($LogFile, 'Ausfälle', 'Anzahl', 0)) + 1)
    IniWrite($LogFile, 'Ausfälle', 'Zeit total', Number(IniRead($LogFile, 'Ausfälle', 'Zeit total', 0)) + $OfflineTime)
    IniWrite($LogFile, 'detailierte Liste', @HOUR & ':' & @MIN & ':' & @SEC & @TAB & @MDAY & '/' & @MON & '/' & @YEAR & @TAB, @TAB & 'Online' & @TAB & 'Wieder online mit der IP ' & _GetIP() & ' nach ' & $OfflineTime & 'ms')
    ; wir sind wieder online nach $OfflineTime millisekunden...
    EndIf
    EndIf
    $Sleep = ($Intervall * 1000) - TimerDiff($Round)
    If $Sleep > 0 Then Sleep($Sleep)
    $Round = TimerInit()
    WEnd

    [/autoit]

    LG
    Christoph :)