• Offizieller Beitrag

    Hi,

    Eine Mini-Funktion zum Logging, die so ähnlich aufgebaut ist wie in anderen Sprachen (Log-Level und Log-Targets).

    Nutzung ist unter MIT-Lizenz erlaubt.

    [autoit]

    ; ##############################################################################
    ; Logging
    ; ##############################################################################
    #include <Date.au3>

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

    ; Konstanten
    Global Enum $LOG_ALL, $LOG_DEBUG, $LOG_WARN, $LOG_ERROR, $LOG_FIX
    Global Enum $LOG_TARGET_CONSOLE, $LOG_TARGET_TRAYTIP, $LOG_TARGET_MSGBOX, $LOG_TARGET_FILE
    ; Default
    Global $log_level = $LOG_ALL
    Global $log_target = $LOG_TARGET_CONSOLE
    Global $log_filename = ""
    Global $log_enable_timing = True

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

    Func _Log($msg_title, $msg = "", $level = $LOG_ERROR)
    ; Log-Level beachten
    If $level < $log_level Then Return
    Local $tCur = _Date_Time_GetLocalTime()

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

    ; Log-Typ beachten
    Switch $log_target
    Case $LOG_TARGET_CONSOLE
    If $log_enable_timing Then
    $msg_title = StringFormat("[%s] %s", _Date_Time_SystemTimeToDateTimeStr($tCur), $msg_title)
    EndIf
    If $msg = "" Then
    ConsoleWrite(StringFormat("%s\n", $msg_title))
    Else
    ConsoleWrite(StringFormat("%s: %s\n", $msg_title, $msg))
    EndIf
    Case $LOG_TARGET_TRAYTIP
    If $log_enable_timing Then
    $msg_title = StringFormat("%s [%s]", $msg_title, _Date_Time_SystemTimeToDateTimeStr($tCur))
    EndIf
    TrayTip($msg_title, $msg, 20)
    Case $LOG_TARGET_MSGBOX
    If $log_enable_timing Then
    $msg_title = StringFormat("%s [%s]", $msg_title, _Date_Time_SystemTimeToDateTimeStr($tCur))
    EndIf
    MsgBox(64 + 4096 + 262144, $msg_title, $msg)
    Case $LOG_TARGET_FILE
    If $log_enable_timing Then
    $msg_title = StringFormat("[%s] %s", _Date_Time_SystemTimeToDateTimeStr($tCur), $msg_title)
    EndIf
    If $log_filename == "" Then
    ; Schreibrechte prüfen
    Local $log_file_paths[3] = [@ScriptDir & "\lastrun.log", @UserProfileDir & "\lastrun.log", @TempDir & "\lastrun.log"]
    For $i = 0 To UBound($log_file_paths) - 1
    $log_filename = $log_file_paths[$i]
    If FileWrite($log_filename, "") == 1 Then ExitLoop
    Next
    ConsoleWrite("Schreibe Log nach " & $log_filename & @CRLF)
    FileDelete($log_filename)
    EndIf
    Local $f = FileOpen($log_filename, 1) ; Write mode (append to end of file)
    If $f <> -1 Then
    If $msg = "" Then
    FileWrite($f, StringFormat("%s\n", $msg_title))
    Else
    FileWrite($f, StringFormat("%s: %s\n", $msg_title, $msg))
    EndIf
    EndIf
    FileClose($f)
    EndSwitch
    EndFunc ;==>_Log

    [/autoit]

    Edit 01.05.2012:
    - Logging in Datei hinzugefügt
    - Optionale Zeitstempel eingeführt

    Johannes

  • Wäre es möglich, dazu auch ein kleines Beispiel zu posten, da ich noch nicht weiß, wie man deine Funktion einsetzen soll?

    • Offizieller Beitrag

    Na klar :).
    Hätte ich schon gleich am Anfang tun sollen, aber hole es jetzt wenigstens nach:

    Spoiler anzeigen
    [autoit]

    #include "Logging.au3"

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

    ; Einstellungen treffen
    $log_level = $LOG_ALL
    $log_target = $LOG_TARGET_CONSOLE

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

    ; Fehler, der immer angezeigt werden soll
    _Log("Schlimmer Fehler", "Loggen nicht getestet!", $LOG_ERROR)
    ; Nicht so schwerer Fehler, wird angezeigt, weil $LOG_ALL gesetzt ist
    _Log("Debug-Information soundso", "", $LOG_DEBUG)
    $log_level = $LOG_ERROR
    ; Nicht so schwerer Fehler, wird diesmal nicht angezeigt, weil $LOG_ERROR als Level gesetzt ist
    _Log("Debug-Information soundso noch einmal", "", $LOG_DEBUG)

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

    ; Ausgaben auf MsgBoxen umstellen:
    $log_target = $LOG_MSGBOX
    _Log("Debug-Information soundso noch einmal", "", $LOG_DEBUG)
    _Log("Schlimmer Fehler", "Loggen nicht getestet!", $LOG_ERROR)

    [/autoit]

    Johannes

  • Da ist ein kleiner Bug bei:

    [autoit]

    Local $f = FileOpen($log_filename, 1) ; Write mode (append to end of file)
    If $f <> -1 Then
    If $msg = "" Then
    FileWrite($log_filename, StringFormat("%s\n", $msg_title))
    Else
    FileWrite($log_filename, StringFormat("%s: %s\n", $msg_title, $msg))
    EndIf
    EndIf
    FileClose($f)

    [/autoit]


    Anstatt $log_filename muss es $f heissen, sonst wird die Dateien zum Schreiben geöffnet, FileWrite versucht zu schreiben, was aber auf Grund der geöffneten Datei nicht klappt und die Datei wird wieder geschlossen, ohne das etwas passiert ist.

    Hier die korrektur

    [autoit]


    Local $f = FileOpen($log_filename, 1) ; Write mode (append to end of file)
    If $f <> -1 Then
    If $msg = "" Then
    FileWrite($f, StringFormat("%s\n", $msg_title))
    Else
    FileWrite($f, StringFormat("%s: %s\n", $msg_title, $msg))
    EndIf
    EndIf
    FileClose($f)

    [/autoit]