Jump to content
Sign in to follow this  
t0nZ

_GOLLOG UDF - LOGs made easy

Recommended Posts

About logs, it is a few years that I drag a couple of functions between one script and another, so finally I decided to write down my first UDF to optimize my scripts.

Main focus is to keep it simple, so you have just to include _gollog.au3 and call:

GOLLOG("a line of text"), and start logging.

If your script is without GUI the log will be only written to disk, if you have a GUI you can initialize an edit control :

GOLLOG_INI($guititle, $left, $top, $width, $height)

and GOLLOG() will write your log both in an auto generated EDIT control in your $guititle GUI and disk; also GOLLOG_INI() will AUTO-create a GUI (if it doesn't exist $guititle) with a screen log if you want !

The majority of options (colors, fonts, position of logs ) are default-defined, but you can initialize them with GOLLOG_INI(), is all documented in the UDF and partially in the example.

There is also a function:

GOLzipLOG($n)

to ZIP logs older than $n months, based on the UDF (also included in attachments) _zip.udf by @wraithdu

the UDF code:

#include-once
#include <File.au3>
#include <_zip.au3>

; #INDEX# =======================================================================================================================
; Title .........: GOLLOG
; AutoIt Version : 3.3.14.0++
; Language ......: English
; Description ...: Smart logging system
; Author(s) .....: NSC
; ===============================================================================================================================

; ------------------------------------------------------------------------------
; This software is provided 'as-is', without any express or
; implied warranty.  In no event will the authors be held liable for any
; damages arising from the use of this software.

; #VARIABLES# ===================================================================================================================
; internal use
Global $gollogcount = 0 ;total number of chars in editbox
Global $lastlog = "sicrlf" ;carriage return default yes "sicrlf" or no onetime "nocrlf", see func GOLLOG
Global $cachelog = "" ;to count number of chars on single line
Global $Gollogedit = "" ;name of edit control
; to initialize with func _GOLLOG_INI
Global $guititle = "" ;name of gui for checkin' if activate on screen loggin'
Global $geleft = 0 ;left coord edit box
Global $getop = 0 ;top coord edit box
Global $gewidth = 0 ;width of edit box
Global $geheight = 0 ;height of edit box
; optionally to initialize with func _GOLLOG_INI, otherwise default values used
Global $GEfontcolor = "0x00FF00"
Global $GEbkcolor = "0x000000"
Global $GEfont = "consolas"
Global $GEfontsize = 8
Global $gefontweight = 800
Global $logpath = @ScriptDir & "\logs"
Global $logfile = $logpath & "\" & StringTrimRight(@ScriptName, 4) & "_LOG_"
; ===============================================================================================================================


; #CURRENT# =====================================================================================================================
; GOLLOG_INI
; GOLLOG
; GOLzipLOG
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
; cleanedit
; ===============================================================================================================================

#comments-start
    Changelog:
    ; V.2.31 2014-2015-2016-2018 only functions up to this version
    ; V.3.00 2018/07/30 first attempt to convert to UDF
    ; V.3.02 2018/08/03 bugfix in log folder creation
    ideas to do
    don't repeat timestamps, at least on GUI , or highlight only time changes
    in line option to display also as balloon text one or more lines
    in line option to write only on screen and not on disk
    in line option to change font size / color only on one line

#comments-end

; #FUNCTION# ====================================================================================================================
; Name...........: GOLLOG_INI
; Description ...: Initialize variables for GOLLOG edit, and creates the GOLLOG EDIT BOX
;                  if the Gui window is not existant ($guititle) also creates the windows gui;  in this case, the parameters of
;                  coords and dimensions are used for the new gui window, but are coords and dimensions are inverted
;                  due to different parameters order in GUICreate and GUICtrlCreateEdit
;                  if not called gollog only write to disk with default setting (because $guititle = "")
;                  if called with &guititle = "", the edit box related variables are ignored but you can still define values for the log file
; Syntax.........: GOLLOG_INI ($guititle, $geleft, $getop, $gewidth, $geheight[, $gefontcolor [, $gebkcolor  [, $gefont [, $gefontsize [, $gefontweight [, $logfile [, $months2NOTzip ]]]]]]] )
; Parameters ....: $guititle  - name of gui
;                  $geleft - left coord of the edit (for windows gui: width)
;                  $getop - top coord of the edit (for windows gui: height)
;                  $gewidth - width of the edit (for windows gui: left coord)
;                  $geheight - height of the edit (for windows gui: top coord)
;                  $gefontcolor - optional color of font in edit control
;                  $gebkcolor - optional color of background of edit control
;                  $gefont - optional font type
;                  $gefontsize - optional size of font
;                  $gefontweight - optional weight of font
;                  $logfile - optional complete path\name of the logfile (datetime will be still added to the name)
;                   otherwise default path\name will be used
; Return values .: Success - Returns "OK"
;                  Failure - error message, sets @error = 1
;                   set @extended
;                  |1 - left cooord missing
;                  |2 - top coord missing
;                  |3 - widht missing
;                  |4 - height missing
; Author ........: NSC
; Modified.......:
; Remarks .......:
; Related .......: GOLLOG
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func GOLLOG_INI($Fguititle, $Fgeleft, $Fgetop, $Fgewidth, $Fgeheight, $FGEfontcolor = "0x00FF00", $FGEbkcolor = "0x000000", $FGEfont = "consolas", $FGEfontsize = 8, $Fgefontweight = 800, $Flogfile = @ScriptDir & "\logs\" & StringTrimRight(@ScriptName, 4) & "_LOG_")
    $guititle = $Fguititle
    $geleft = $Fgeleft
    $getop = $Fgetop
    $gewidth = $Fgewidth
    $geheight = $Fgeheight
    ; optionally to initialize with func _GOLLOG_INI, otherwise default values used
    $GEfontcolor = $FGEfontcolor
    $GEbkcolor = $FGEbkcolor
    $GEfont = $FGEfont
    $GEfontsize = $FGEfontsize
    $gefontweight = $Fgefontweight
    $logfile = $Flogfile

    If $guititle = "" Then
        Return "paramter GUI title missing"
    EndIf
    If $geleft = "" Then Return SetError(1, 1, "edit: left cooord missing")
    If $getop = "" Then Return SetError(1, 2, "edit: top coord missing")
    If $gewidth = "" Then Return SetError(1, 3, "edit: widht missing")
    If $geheight = "" Then Return SetError(1, 4, "edit: height missing")

    If Not WinExists($guititle) Then
        If $geleft = "" Then Return SetError(1, 1, "GUI: width missing")
        If $getop = "" Then Return SetError(1, 2, "GUI: heigh missing")
        If $gewidth = "" Then Return SetError(1, 3, "GUI: left cooord missing")
        If $geheight = "" Then Return SetError(1, 4, "GUI: top coord missing")
        $test = GUICreate($guititle, $geleft, $getop, $gewidth, $geheight)
        ; modify parameters to fit edit in "auto" generated GUI
        $gewidth = $geleft - 10
        $geheight = $getop - 10
        $getop = 5
        $geleft = 5
        cleanedit()
        GUISetState(@SW_SHOW)
    Else
        If $geleft = "" Then Return SetError(1, 1, "left cooord missing")
        If $getop = "" Then Return SetError(1, 2, "top coord missing")
        If $gewidth = "" Then Return SetError(1, 3, "widht missing")
        If $geheight = "" Then Return SetError(1, 4, "height missing")
        cleanedit()
    EndIf
    Return "OK"
EndFunc   ;==>GOLLOG_INI

; #FUNCTION# ====================================================================================================================
; Name...........: GOLLOG
; Description ...: writes one line of log
;                  if there isn't edit control, the line is only written on the log file
;                  if there is also an associated edit control, it writes both on screen and on file
; Syntax.........: GOLLOG(ByRef $logtext)
; Parameters ....: $logtext  - a string of text to be written down on disk and on screen
;                  if $logtext containg at the end a substring like "|nocrlf50" that line does not CR ("noCRLF")
;                  except if the max specified number of chars on the line ("50") is excedeed
;                  next call of Gollog() without substring "|nocrlf50" restores auto Carriage Return behaviour
; Return values .: n/a
; Author ........: NSC
; Modified.......:
; Remarks .......:
; Related .......: GOLLOG_INI,cleanedit
; Link ..........:
; Example .......: no
; ===============================================================================================================================
Func GOLLOG($logtext)
    If Not FileExists($logpath) Then
        DirCreate($logpath) ; pre-UDF this was in the scripts
    EndIf
    $gollogcount += StringLen($logtext)
    Local $logfiletimerange = @YEAR & @MON
    Local $linelimit = StringRight($logtext, 2)
    If StringRight($logtext, 9) = "|nocrlf" & $linelimit Then
        $logtext = StringTrimRight($logtext, 9)
        Local $acapo = "no"
    Else
        Local $acapo = "si"
        $gollogcount += 4
        If $gollogcount > 13000 And $guititle <> "" Then
            ;Sleep(3000)
            cleanedit()
            ;   MsgBox(64, "debug", $conta)
            $gollogcount = 0
        EndIf
    EndIf

    If $acapo = "no" And (StringLen($cachelog) <= $linelimit) Then ;pearl perla no CRLF if > linelimt
        If $lastlog = "nocrlf" Then
            If WinExists($guititle) Then ; no GUI no on screen log
                GUICtrlSetData($Gollogedit, $logtext, 1)
            EndIf
        Else
            If WinExists($guititle) Then ; no GUI no on screen log
                GUICtrlSetData($Gollogedit, @MDAY & "/" & @MON & "_" & @HOUR & ":" & @MIN & " " & $logtext, 1)
            EndIf
        EndIf
        $cachelog = $cachelog & $logtext
        $lastlog = "nocrlf"
    Else
        If $lastlog = "nocrlf" Then
            If WinExists($guititle) Then ; no GUI no on screen log
                GUICtrlSetData($Gollogedit, $logtext & @CRLF, 1)
            EndIf
            $cachelog = $cachelog & $logtext
            _FileWriteLog($logfile & $logfiletimerange & ".txt", $cachelog)
            $cachelog = ""
        Else
            If WinExists($guititle) Then ; no GUI no on screen log
                GUICtrlSetData($Gollogedit, @MDAY & "/" & @MON & "_" & @HOUR & ":" & @MIN & " " & $logtext & @CRLF, 1)
            EndIf
            _FileWriteLog($logfile & $logfiletimerange & ".txt", $logtext)
        EndIf
        $lastlog = "sicrlf"
    EndIf
EndFunc   ;==>GOLLOG

; #FUNCTION# ====================================================================================================================
; Name...........: GOLzipLOG
; Description ...: takes all log files older than specified number of months, and zip these in a unique zip file, in the same folder
; Syntax.........: GOLLOG(ByRef $months2notZIP)
; Parameters ....: $months2notZIP  - number of months (age of log files) to not zip
; Return values .: n/a
; Author ........: NSC
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: no
; ===============================================================================================================================
Func GOLzipLOG($months2NOTzip) ; zipping old log leaving unzipped only n months
    GOLLOG("ZIPping log files older than " & $months2NOTzip & " months")

    Local $hSearch = FileFindFirstFile($logfile & "*.txt") ; searching for logs
    Local $logconta = 0
    Local $logfiletimerange = @YEAR & @MON
    While 1 ; single file processing cycle
        Local $sFileName = FileFindNextFile($hSearch)
        ; If there is no more file matching the search.
        If @error Then ExitLoop

        Local $stringtime = StringTrimRight(StringRight($sFileName, 10), 4) ;obtaining year-month like 201609

        If $logfiletimerange - $stringtime > $months2NOTzip Then ;zipping

            If Not FileExists($logfile & ".zip") Then
                If Not _Zip_Create($logfile & ".zip", 1) Then
                    GOLLOG("Error " & @error & " creating " & $logfile & ".zip")
                Else
                    GOLLOG("Created new log archive: " & $logfile & ".zip")
                EndIf
            Else
                GOLLOG("adding to archive: " & $logfile & ".zip")
            EndIf
            If Not _zip_additem($logfile & ".zip", $logpath & $sFileName) Then
                GOLLOG("Error " & @error & " zipping:  " & $logpath & $sFileName)
            Else
                GOLLOG("Added: " & $logpath & $sFileName)
                $logconta += 1
                If Not FileDelete($logpath & $sFileName) Then
                    GOLLOG("ERROR - Unable to DELETE log file " & $logpath & $sFileName)
                EndIf
            EndIf
        EndIf
    WEnd
    GOLLOG("Finished = " & $logconta & " log files zipped")
EndFunc   ;==>GOLzipLOG

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: cleanedit
; Description ...: create the edit box delete edit box and recreate it with same parameters
;                  when the edit box is "full" of chars delete edit box and recreate it with same parameters
;                  parameters are global variables specified in GOLLOG_INI
; Syntax.........: cleanedit()
; Parameters ....: n/a
; Return values .: n/a
; Author ........: NSC
; Modified.......:
; Remarks .......:
; Related .......: GOLLOG_INI
; Link ..........:
; Example .......: no
; ===============================================================================================================================
Func cleanedit() ; cleaning of edit every n° lines (in program put if $nlines > xlines then this function)
    GUICtrlDelete($Gollogedit)
    $Gollogedit = GUICtrlCreateEdit("", $geleft, $getop, $gewidth, $geheight) ;, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $WS_BORDER))
    GUICtrlSetData(-1, "" & @CRLF)
    GUICtrlSetFont(-1, $GEfontsize, $gefontweight, 0, $GEfont)
    GUICtrlSetColor(-1, $GEfontcolor)
    GUICtrlSetBkColor(-1, $GEbkcolor)
    GUICtrlSetCursor(-1, 3)
EndFunc   ;==>cleanedit

the example code:

; *** GOLLOG UDF test script ***
; (C) NSC 2018

#include <_GOLLOG.au3>


MsgBox(64,"GOLLOG example 1","no GUI, only write on disk, check the log file in @scriptdir" & @CR & "note: no initialization GOLLOG_INI() is required!")
Gollog("this is the first line of log only in the file")

MsgBox(64,"GOLLOG example 2","log and edit on pre-existant GUI")
$mygui = "edit on existant gui"

Guicreate($mygui, 600,300,300,300)
GUISetState(@SW_SHOW)
gollog_ini($mygui,5,5,590,290) ;basic initialization, no aestetic options

Gollog("this is  the first line |nocrlf50") ; no carriage return with -> |nocrlf50
Gollog("on the pre-existant GUI") ; auto CR restored

$a = 0
while $a < 50
 GOLLOG("Example 2 line:" & $a)
 $a +=1
 sleep(100)
 wend
GUIDelete($mygui)

MsgBox(64,"GOLLOG example 3","log and edit on 'auto' generated GUI")
$mygui = "auto generated GUI"
gollog_ini($mygui,600,300,200,200,"0x0033cc","0xffff00","courier") ; initialization with colors and font choice, more options see the UDF
Gollog("this is  the first line |nocrlf50")
Gollog("on the 'auto' generated GUI")

$a = 0
while $a < 50
 GOLLOG("Example 3 line:" & $a)
 $a +=1
 sleep(100)
wend

MsgBox(64,"GOLLOG example 4","auto re-creation of edit") ; recreate edit before it is "full"
Gollog("to recreation of edit control")
while $a < 1500
 GOLLOG("Example 4 line:" & $a)
 $a +=1
wend

 

Some options are a bit weird, because I kept retro-compatibility with all my scripts, removing functions and adding the UDF...

Greetings to all of you.

 

 

GOLLOG_UDF_TEST.au3

_Zip.au3

_GOLLOG.au3

Edited by t0nZ
new version, bugfixes

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Alok_Arora
      Hello Sir, 
      While searching for the solution to my problem, I have just gone through some of your old post. 
      My name is Alok Arora 
      Email id is *snip*
      I am writing a code to store logs for each script I run. This I did by using FileWriteLog function and it is successfully storing logs in txt file. 
      Now, I have to work on to read the log file and if any script has been mistakenly clicked twice in a day script will pop up a message that task already done for the day by verifying entries in the log file. 
      I have the logic for it.. 
      I mean a variable will read the log file and will search for the entry and will perform action if entry found or not. 
      I believe for reading the file I can write a code like
      $i =fileread("logfile.txt")
      Now I am stuck on how to compare the log entry in log file. 
      Can you please help me in this? 
    • By Danyfirex
      Hello guys.  It's been awhile since I shared something. So today I want to share my last project.
      What's Loga?
      Loga is a simple logging library to keep track of code with an integrated console.
      Features.
      Common log levels. Integrated console. Multiple instances. Custom color and font for each instance log level. Define output format with macros. Conditional and occasional Logging. Easy to use. Basic Usage:
      #include "..\Loga.au3" ;This are some of the default settings: ;Default log level $LOGA_LEVEL_TRACE ;output format: {Symbol}{LogIndex} {LevelName} {LongDateTime} {Message} ;Log to File is enabled. ;Log file name format: YYYYMMDDHHMM-Loga-InstanceIndex.log ;Custom Console is disabled by default. ;By default log to STDOUT. _LogaTrace("I'm Trace") _LogaDebug("I'm Debug") _LogaInfo("I'm Info") _LogaWarn("I'm Warn") _LogaError("I'm Error") _LogaFatal("I'm Fatal")  
      More examples here.
       
      Check Loga on GitHub.
       
      Loga Latest Release v1.0.2.
       
      Saludos
       
       
       
       
    • By Vivaed
      I have another AutoIT script making a Log file 

      Sample of Log file:
      2016/08/22 12:44:18 > Process: [RUNNING] [ACTIVE] 2016/08/22 12:48:35 > Process: [WAS NOT RUNNING] 2016/08/22 13:40:00 > Process: [FAILED] 2016/08/22 14:01:10 > Process: [WAS NOT RUNNING] I am looping through the Log file for  the word "FAILED"
      I then want to get all lines that have "FAILED" and get their TIME
       
      My Current code to get this far:
      If FileExists($fileLog) Then $contents = FileRead($fileLog) If @error Then MsgBox(0, 'File Error', $fileLog & ' could not be read.') Else For $i = 1 To _FileCountLines($fileLog) $result = StringInStr($contents,$search) If $result >= 1 Then $filteredLine = FileReadLine($fileLog,$i) If StringInStr($filteredLine,$search) Then ConsoleWrite($filteredLine & @CRLF) ; this gets me the results I want sans the time parse EndIf Else ConsoleWrite( $search & " not found!" & @CRLF) EndIf Next EndIf EndIf For this part:
      If StringInStr($filteredLine,$search) Then ConsoleWrite($filteredLine & @CRLF) ; this gets me the results I want sans the time parse EndIf OUTPUT: 2016/08/22 13:40:00 > Process: [FAILED] I dont understand how I read the time in that output?
       
      I have tried _DateTimeFormat - Dont think this applies 
      Tried _DateDiff - I dont have a the date yet so this doesnt work
       
      Would love if someone could tell me if I am thinking is the wrong direction and possibly lead me down the correct path to light side of the force  

       
    • By mmoalem
      Hi there - quite a beginner to codding so please bare with me...
      i am writing an autoit code that will be running 24/7 executing various tasks every 10-20 minutes. it suppose to run on unattended server but i would like to occasionally remote log in and do stuff on the server without disturbing the autoit script (while the autoit script is in Sleep count). to achieve this I will need to know at what point in the commands run it is  and how long roughly until the next command (I use Sleep in between commands)...
       so, is there a way to create a monitor that shows me the last command executed and how long of the Sleep is left (like in a small window or in the windows task bar)?
      failing that any idea how can I utilize the FileWriteLog function to keep updating an always open text file ?
       
      thanks in advance
      michel
    • By Fade91
      Hello, first time poster here
      I am working on a project that has to parse a log file in real time. The thing is I know it's hard for Autoit to attach itself to log files when they're already in use by other programs, at least in my experience.
      I was taking a look at this thread because the log file is quite large and I think Autoit might be a little slow on it's own.

      The thing is I don't know how to use this properly to extract all data out of a log file or is there a native way to do this using Autoit.
      Basically , I just need a log parser that is able to read from a log that is 'already opened' and 'being written to'
       
      Thanks!
×
×
  • Create New...