Jump to content
rsmedude

Help with trimming a LOG file

Recommended Posts

rsmedude

Hello everyone,

I have been a member for a while but relatively new to posting to the message boards. I am also still relatively new to using AutoIt. I am working on a script that will help keep a program running on one of my file servers.

Here is what I have accomplished so far looking at different threads on the site already.

1. A check performed every 60 seconds to see if the application is running. (ultimately to be changed to something like once an hour)

2. Write a log file that shows either the check was performed with no issue or the application had to be restarted.

Both of those are working fine and I have to say that ever since I started using this script the program has not crashed!

My next phase is to figure out how to make the script check and trim the log file. I am obviously not trying to make a log file that becomes bloated and chews up a large amount of hard drive space. The main purpose of the log file is so that I know if the application has been restarted. I am thinking have the script trim the file every 30 day maybe. Another words delete everything in the log file 30 days prior to the current day. So if someone can help me out here as I am not a scripting genius. Unfortunately I only know enough to be dangerous if you will.

I also have another part of this script I want to write but first I want to get the log file working just the way I want. I am attaching a sample of what I have working so far.

Thank you for any and all help folks.

Respectfully,

James

 

#include <File.au3>

 While 1 ;Start Loop

   If ProcessExists("atcsmon.exe") Then

   ;~ Open the logfile in write mode.

   Local $hFile = FileOpen(@ScriptDir & "\ATCS_AutoIt.log", 1)

   _FileWriteLog($hFile, "ATCS check was completed and found running by the AutoIt3 Script") ; Write to the logfile passing the filehandle returned by FileOpen.

   FileClose($hFile) ; Close the filehandle to release the file.

   Else ;If Process does not exist

   Run("C:\atcs_monitor\atcsmon.exe", "", @SW_SHOWMINIMIZED)

   ;~ Open the logfile in write mode.

   Local $hFile = FileOpen(@ScriptDir & "\ATCS_AutoIt.log", 1)

   _FileWriteLog($hFile, "*ALERT* *ALERT* *ALERT* ATCS was restarted by the AutoIt3 Script") ; Write to the logfile passing the filehandle returned by FileOpen.

   FileClose($hFile) ; Close the filehandle to release the file.

   EndIf



   Sleep(60000) ;sleep 60 seconds

 WEnd ;Close Loop

 


[font="Arial"]James D. Williams[/font]

Share this post


Link to post
Share on other sites
Shane0000

Perhaps you could use an INI and use a time stamp as the key.

You could use something like (untested):

#include <Date.au3>
#include <Array.au3>
$sTimeStamp = _NowCalc()
$sEvent = "Alert or Pass text"
IniWrite(@ScriptDir & "\ATCS_AutoIt.log", "Event_Log", $sTimeStamp, $sEvent)



;to delete old entries
$aIniData = IniReadSecion(@ScriptDir & "\ATCS_AutoIt.log", "Event_Log")
For $i = 0 to Ubound($aIniData) - 1
    If _DateDiff("D", $aIniData[$i][0], _NowCalc()) > 30 Then
        _ArrayDelete($aIniData, $i)
        $i -= 1 ;item $i + 1 just became item $i so go back and check the new values in array slot $i
    Else
        ExitLoop ; if the entry is newer than 30 days , stop searching
    EndIf
Next    
IniWriteSection( @ScriptDir & "\ATCS_AutoIt.log", "Event_Log", $aIniData , 1)

 

Edited by Shane0000
Added #includes

Share this post


Link to post
Share on other sites
JLogan3o13

If this is a true monitoring script, why not write to the Event Viewer. You could even set up an email alert to yourself if the event matches certain criteria.


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
rsmedude

Shane0000 - I will look at this and give it a try I suppose I will have to "falsify" some log entries to make sure I am implementing this correctly!

JLogan3o13 - I never thought about going that rout. Well let me rephrase that. I thought about the email alert (more like a text message) if the application goes down. However I never thought about putting it into the system log. Do you have an example of how that would be done in the scripting?

Sorry I am learning as I go with this entire project.

Thank you for the help!

Respectfully,

James


[font="Arial"]James D. Williams[/font]

Share this post


Link to post
Share on other sites
JLogan3o13

There are a number of different ways to do it, but In it's simplest form, you can write the event with a ShellExecute:

 

ShellExecute("EventCreate.exe", '/L Application /T Information /SO "MyApp" /ID 666 /D "My event Message"', "", "", @SW_HIDE)

 

Edited by JLogan3o13

√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
BrewManNH

You can also use the _EventLog_* functions, specifically _EventLog_Open and _EventLog_Report.

  • Like 1

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites
JLogan3o13

+1, totally forgot about the built-in functions :>


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
rsmedude

Perhaps you could use an INI and use a time stamp as the key.

You could use something like (untested):

#include <Date.au3>
#include <Array.au3>
$sTimeStamp = _NowCalc()
$sEvent = "Alert or Pass text"
IniWrite(@ScriptDir & "\ATCS_AutoIt.log", "Event_Log", $sTimeStamp, $sEvent)



;to delete old entries
$aIniData = IniReadSecion(@ScriptDir & "\ATCS_AutoIt.log", "Event_Log")
For $i = 0 to Ubound($aIniData) - 1
    If _DateDiff("D", $aIniData[$i][0], _NowCalc()) > 30 Then
        _ArrayDelete($aIniData, $i)
        $i -= 1 ;item $i + 1 just became item $i so go back and check the new values in array slot $i
    Else
        ExitLoop ; if the entry is newer than 30 days , stop searching
    EndIf
Next    
IniWriteSection( @ScriptDir & "\ATCS_AutoIt.log", "Event_Log", $aIniData , 1)

 

Ok I tried this. and I got the following error.

Line 106 (File "C:\Users\GMS\Desktop\ATCS_UP_CHECK_REV4-temp_test.au3"):

$aIniData = IniReadSecion(@ScriptDir & "\ATCS_AutoIt.log", "Event_Log")

$aIniData = ^ ERROR

 

Error: Unknown function name.

I am not sure what the deal is with this. I suspect it has something to do with the part of the argument that has "Event_Log" in it. I did try messing with it but I didn't have any success. Shane0000, if I could get a little help debugging this I would appreciate it.

 

JLogan3o13, I have not totally thrown your suggestion out the window. I am interested in using that but mainly for the error (if the program has to be restarted) but I think I am going to hold off on that for the moment. I am also interested in using that system so that I can have the server send me an email (text) to my phone so that I know if it puked. This way I can remote in and make sure it actually came back up for me.

 

Respectfully,

James


[font="Arial"]James D. Williams[/font]

Share this post


Link to post
Share on other sites
jchd

Try IniReadSecTion(... instead.

  • Like 1

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites
rsmedude

OH FOR CRYING OUT LOUD!!!!!!!!

 

Ok I feel uber stupid now! lol

 

Thank you,

James


[font="Arial"]James D. Williams[/font]

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

  • Similar Content

    • blemas
      By blemas
      The McAfee return for AV defs per "C:\Progra~1\Common~1\McAfee\SystemCore\csscan.exe -Versions" is ...
      CommonShell Command Line Scanner Lite (VSCORE.15.5.0.3960)
          Engine version: 5800.7501
          DAT version:    8450.0
          Time required:  15 milliseconds
      I want to isolate the actual DAT version as "8450.0".  There may be an easier way to get the DAT Version via other McAfee or registry methods but essentially I just want to know how to parse a string at a character or @CRLF into two separate strings for further parsing. Example:
      $string = "Name=Microsoft Windows 10 Professional |C:\windows|\Device\Harddisk0\Partition2"
      Parse into $var1 = "Name" & $var2 = "Microsoft Windows 10 Professional |C:\windows|\Device\Harddisk0\Partition2"
      From there I'd like to parse $var2 at "|" into  $var3 = "Microsoft Windows 10 Professional" and $var4 "C:\windows|\Device\Harddisk0\Partition2"
       
       
       
       
       
    • Vivaed
      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  

       
    • mmoalem
      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
    • TheDcoder
      By TheDcoder
      Hello, I have a simple task today, I am sure that I made a similar post a long time ago... I want trim (delete or remove or wipe) the contents of a file (text or binary) WITHOUT storing the contents of the file anywhere in the script. Here is a text file for the purpose of experimenting: (contents of text.txt)
      1234567890 The task is simple, remove "456" from the contents of text.txt WITHOUT storing the contents anywhere! I wanted to post some code but it seems impossible to provide any relevant code this time...
       
      Good luck with the challenge! TD
    • Fade91
      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!
×