Cleaning up the TM1 Message Log
- Aug. 31, 2013
Introduction
One of the text files on a TM1 system, is the TM1 message log. The file is called tm1server.log and it resides in the TM1 log folder. Usually, for backup reasons, this folder is separated from the TM1 data directory: it is the TM1s.cfg file that holds the location of both these vastly important directories. The TM1 message log contains a chronological log of quite a number of things in TM1:
- TI Process executions (which TI process, when, by which user, process outcome, …)
- All information regarding objects that are loaded when the TM1 server is loaded into memory;
- Cubes that are seen as dependent on each other;
- Chores that run;
- And much more
Each time, the entry is marked as INFO or ERROR, indicating possible causes of concern in case the latter is true. There are other options too, for example DEBUG: they are not often needed to be set. If you do need it however, copy the tm1s-log.properties file into the folder where your TM1 configuration file (TM1s.cfg) houses, and set its entries accordingly. The message log can get very long, even though there are certain entries in that tm1s-log.properties file that can make sure the log file size remains under control:
- MemorySize;
- MaxFileSize;
- MaxBackupIndex
And now I come to the meat of this blog article. What about the following situation: in the absence of generic functions in Turbo Integrator (sic), you want to execute a custom TI process with parameters. That is not too difficult nor advanced, but if you execute the process, say, 100,000 times in a loop, there will be 200,000 entries in the message log. (In some extreme cases, you cannot do better than having that many ExecuteProcess statements.) As you are a proficient TM1 guy/gal who writes very fast TI processes, all entries could be showing as:
8456 [] INFO 2013-08-26 20:37:55.647 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.627 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.627 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.607 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.607 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.587 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.587 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.567 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.567 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.547 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.547 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.527 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.527 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.507 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.507 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.487 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.487 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.467 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis" 8456 [] INFO 2013-08-26 20:37:55.467 TM1.Process Process "Calculate Hours": finished executing normally, elapsed time 0.02 seconds 8456 [] INFO 2013-08-26 20:37:55.447 TM1.Process Process "Calculate Hours" executed by user "Wim Gielis"Imagine this goes on for another 99,990 times - not very appealing, is it? How about removing these lines with a small procedure?
VBA-code
You could do this in a number of ways:
- VBScript or VBA-code
- Turbo Integrator code
- A different tool / programming language
Sub Clean_Up_Message_Log()' Wim Gielis ' https://www.wimgielis.com''''' ' Cleaning out the TM1 Message Log with VBA ' 08/26/13 '''''Const MessageLog As String = "C:\TM1Logfiles\tm1server.log" Const DeleteWhat As String = "Process ""Calculate Hours""" 'get the file contents Open MessageLog For Input As #1 c0 = Input(LOF(1), #1) Close #1 'remove all unnecessary message log entries c0 = Join(Filter(Split(c0, vbCr), DeleteWhat, False), vbCr) 'write to the message log again Open MessageLog For Output As #1 Print #1, c0; Close #1End Sub
The code above shows some nice tricks/constructs:
- Opening a text file and filling a variable with its contents, requires 3 lines of code here;
- After that, we split up the text file contents by Carriage return, filter out the entries with the desired text string, and join the remainder again with Carriage returns;
- Writing the result to the text file again takes only 3 lines of code;
- When writing to the text file again, we avoid extra line breaks at the bottom of the file, by putting the semicolon at the end of the Print statement.
That is all code it takes. Wanna try with other unnecessary message log entries in your TM1 message log? Please feel free to use these coding tricks in other projects of yours.
To continue towards a Turbo Integrator solution, here is the VBScript code:
' Wim Gielis ' https://www.wimgielis.com''''' ' Cleaning out the TM1 Message Log with VBScript '''''Const MessageLog As String = "C:\TM1Logfiles\tm1server.log" Const DeleteWhat As String = "TM1.Process Process ""Calculate Hours""" With CreateObject("Scripting.FileSystemObject") 'get the file contents With .OpenTextFile(MessageLog, 1) c0 = .ReadAll .Close End With 'remove all unnecessary message log entries c0 = Join(Filter(Split(c0, vbCr), DeleteWhat, False), vbCr) 'write to the message log again With .OpenTextFile(MessageLog, 2) .WriteLine Left(c0,Len(c0)-2) .Close End With End With
Lastly, the TI code that calls the VBS:
# Wim Gielis # https://www.wimgielis.com##### # Calling a VBScript code through TI to clean up the TM Message Log #####ExecuteCommand( 'cscript "clean_up_message_log.vbs"', 1);
Hereby I assume that you paste the .vbs file into the TM1 Data Directory (by default, in the absence of a path, TM1 will look for files in its Data Directory). Good luck with it and let me know when you can make my codes to good use.