_LogFile - Einfach LogFiles erstellen und schreiben

  • Guten Morgen zusammen,
    ich hatte Ende 2015 mal eine kleine UDF für mich geschrieben mit der ich leichter LogFiles erstellen und schreiben kann.
    Nachdem ich meine Festplatten mal aufgeräumt habe, habe ich die UDF endlich wiedergefunden.

    Spoiler anzeigen
    Spoiler anzeigen
    AutoIt: ExampleScript.au3
    #include "_LogFile.au3"
    _WriteLogMessage(0, "Nichts")
    _WriteLogMessage(1, "Information")
    _WriteLogMessage(2, "Warnung")
    _WriteLogMessage(3, "Fehler")
    _WriteLogMessage(4, "Kritischer Fehler")

    Es ist nichts großartiges, aber vielleicht kann es mal jemand gebrauchen.

    Für Tipps und Anregungen bin ich jederzeit offen :)

    LG

    Philip

  • Hi @n00b-it,
    Ich würde die UDF um die Möglichkeit von _FileWriteLog erweitern, dass man bestimmen kann, ob die neuen Einträge immer an die Liste angehängt werden, oder als erste Zeile in der Logdatei erscheinen. Ich persönlich sehe jedenfalls die letzten Einträge gerne zuerst.

    Grüße autoiter

  • Hallo @autoiter,
    danke für Deine Rückmeldung.
    Aus diesem Blickwinkel habe ich das noch nie betrachtet. Macht eigentlich mehr Sinn, da man ja direkt den Eintrag sieht der einen Eventuellen Fehler verursacht hat.
    Ich werde mal versuchen das mit einzubauen.

    LG

    Philip

  • Da du das als UDF veröffentlichst:

    AutoIt
    Global $h_LOG_FILE = Null
    Global $s_LOG_FILE = @ScriptDir & "\" & @YEAR & "_" & @MON & "_" & @MDAY & "-logfile.log"

    Sowas schreibt man nicht, da dann die UDF editiert werden muss, wenn der Pfad geändert werden soll.

    Man würde einen _Init Befehl schreiben, bei dem der Pfad übergeben werden kann(, evtl. auch mit dem Pfad als Optionalen Parameter, falls du denkst, dass viele den Aktuellen Namen nutzen würden), oder den Open/Close Befehl öffentlich machen, sodass man dort den Pfad angibt. Das würde ich auch bevorzugen, da dann auch mehrere Log-Dateien genutzt werden können, wenn die _write Funktion auch einen Parameter für den Handle bekommt. Auch macht das nutzen der open und close-funktion bei jedem write momentan keinen wirklichen sinn, da filewrite das auch intern macht. Man könnte einfach den pfad angeben ;)

    Außerdem benennt man UDF funktionen normalerweise __UDFNAME_Function, wobei UDFNAME auch ein kürzel sein kann. Bei Globalen Variablen kommt dann auch $__UDFNAME_Variable, damit kein Nutzer ausversehen die gleiche Variable anlegt und dadurch Konflikte entstehen ;)

    Dann würde man bei den Kommentaren:
    ;Parameters ....: $i_LOG_LEVEL - an integer value. Can be a value from 0 to 4. Each value is specifying a certain string in $a_LOG_LEVEL
    Dabei noch die 5 Möglichkeiten auflisten, also sowas:

    AutoIt
    ;Parameters ....: $i_LOG_LEVEL - an integer value. Can be a value from 0 to 4. Each value is specifying a certain string in $a_LOG_LEVEL
    ;                            0 - Nichts
    ;                            1 - Information
    ;...

    Dann muss man als Nutzer nicht im Quellcode nachsehen, was es dort für Möglichkeiten gibt. Solche genaueren Infos kann man auch in die REMARKS schreiben :)

    Bei größeren UDFs kann man daraus dann auch automatisch Hilfe-Dateien generieren.

    Nur mal als Tipps für UDFs genannt :)

    MfG Kanashius

    • Offizieller Beitrag

    Logdaten werden u.U. in hoher Frequenz geschrieben. Insofern ist es nicht sinnvoll bei jedem Schreibvorgang die Datei zu öffnen, dann zu schreiben und die Datei zu schliessen.
    Besser:
    - globale Variable für das File-Handle $_g_fHwndLog
    - eine Funktion z.B. _Log_Init(optionaler_Dateiname), die das $_g_fHwndLog für FileOpen verwendet
    - Logfunktion _Log_Write(Msg), die das offene Handle nutzt
    - Shutdown-Funktion _Log_ShutDown(), die mit OnAutoItExitRegister() $_g_fHwndLog schliesst.

    Falls verschieden Logdateien gleichzeitig bedient werden sollen, kann kein globales HWnd verwendet werden, sondern muß beim Init als Return aufgefangen und bei jedem Schreibvorgang übergeben werden, ebenso beim Shutdown.

  • Hallo @Kanashius und @BugFix,

    vielen Dank für eure Kommentare. Werde mir das alles noch mal in Ruhe zu Gemüte führen und dann alles neu umsetzten.
    Eure Beiträge tragen viel zum Verständnis von UDFs bei :)
    Hab grade auch noch diesen Link gefunden. Weiß jemand ob der aktuell ist oder ob es was aktuelleres gibt?

    LG

    Philip

  • Nochmal eine Frage.
    Bin ich so auf einem besseren Weg oder habe ich irgendwas falsch verstanden?

    Spoiler anzeigen
    Spoiler anzeigen

    LG

    Philip

    • Offizieller Beitrag

    Ob man mehrere Logfiles möchte ist natürlich persönliche Meinung

    Das ist eher konzeptabhängig. Wenn jedes Event geloggt wird ist es durchaus auch sinnvoll, im Interesse der besseren Auswertbarkeit, Logs für allgemeine Events und Events für Fehler zu trennen.

  • AutoIt
    Func __LogFile_Write($i_LOG_LEVEL, $s_LOG_MESSAGE)
    	Local $a_LOG_LEVEL[] = ["Nichts ----------------", "Information -----------", "Warnung ---------------", "Fehler ----------------", "Kritischer Fehler -----"]
    	FileWriteLine($__g_fHwndLog, "[" & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "] -> " & $a_LOG_LEVEL[$i_LOG_LEVEL] & " -> " & $s_LOG_MESSAGE)
    EndFunc   ;==>


    Zu Zeile 2:
    Local $a_LOG_LEVEL[] = [...] ; wenn du keinen Wert angibst, kannst du die [] auch weglassen.
    Local $a_LOG_LEVEL = [...]

    "Nichts ----------------"; Hust... da kann ich geistig nicht folgen, wofür das gut sein soll. ?(

    Zu Zeile 3:
    FileWriteLine($__g_fHwndLog, ... ; Kann bitte mal jemand diesen Variablennamen aufschlüsseln? :D
    FileWriteLine($__g_hLog, ... ; wäre doch treffender?!

    Ansonsten würde ich die Funktion eher so schreiben...