cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
jchristman
Level 8

InstallScript Logging

I cannot seem to find how to turn on Logging with Installscript?

I would also like to be able to write to this log file from Installscript. I have several of my own scripts and would like to add all the information taking place in them into the log file.

Any help would be appreciated.
Labels (1)
0 Kudos
(11) Replies
RobertDickau
Flexera Alumni

I don't think InstallScript has any built-in logging (to a text file, in the way MSI does) functionality. I haven't used it, but for one approach perhaps see www.installsite.org > InstallScript Samples > Misc > Log Results of Function Calls.

In any case, uninstallable system changes are written to the binary .ilg file that's created in DISK1TARGET, and you can view its contents on your development system using the log file viewer. There are also functions for writing and reading custom strings to the .ilg file.
0 Kudos
jchristman
Level 8

Thank you this was very helpful.
0 Kudos
TheTraveler
Level 8

I too like creating log files when I do my installations. It is great way to debug the problem without having to run the installation in debug mode. Here are my routines I use.

My_log.h
///////////////////////////////////////////////////////////////////////////////
// //
// I n s t a l l S h i e l d . h D e c l a r a t i o n s //
// //
///////////////////////////////////////////////////////////////////////////////
#ifndef _MY_LOG_H_
#define _MY_LOG_H_

///////////////////////////////////////////////////////////////////////////////
// N C L L o g F u n c t i o n s //
///////////////////////////////////////////////////////////////////////////////
prototype My_OpenLogFile(BYVAL STRING, BYVAL STRING);
external prototype My_AddToLog(BYVAL STRING);
prototype My_CloseLogFile();

///////////////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////
NUMBER m_hLogFile;

///////////////////////////////////////////////////////////////////////////////
// //
// E n d o f . h F i l e //
// //
///////////////////////////////////////////////////////////////////////////////
#endif



My_log.rul
[CODE]#ifndef _MY_LOG_RUL_
#define _MY_LOG_RUL_
///////////////////////////////////////////////////////////////////////////////
// //
// M Y _ L O G . R U L //
// //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////////////////////////
function My_OpenLogFile(strTitle, strLogFileName)
BOOL bResult;
NUMBER nvTemp;
STRING strDateTime;
STRING strFileName;
STRING strPath;
STRING strTemp;
string szProperty[256];
begin
m_hLogFile = 0;

strFileName = strLogFileName;
if strLogFileName = "" then
strFileName = "MyInstall.log";
endif;

if GetEnvVar("TEMP", strPath) < 0 then
strPath = "C:\\";
endif;

///////////////////////////////////////////////////////////////////////////
// Make sure that the directory exists //
///////////////////////////////////////////////////////////////////////////
if (ExistsDir(strPath) != EXISTS) then
if strPath != "C:\\" then
strPath = "C:\\";
else
return FALSE;
endif;
endif;

///////////////////////////////////////////////////////////////////////////
// Open The UpgradeList.txt File //
///////////////////////////////////////////////////////////////////////////
bResult = TRUE;
OpenFileMode(FILE_MODE_APPEND);
if CreateFile(m_hLogFile, strPath, strFileName) = 0 then
GetSystemInfo (DATE, nvTemp, strDateTime);
GetSystemInfo (TIME, nvTemp, strTemp);
strDateTime = strDateTime +" "+ strTemp;

if strTitle = "" then
//nvTemp = SizeOf(szProperty);
//MsiGetProperty(ISMSI_HANDLE, "Title", szProperty, nvTemp);
//strTitle = szProperty;
endif;

My_AddToLog("///////////////////////////////////////////////////////////////////////////////");
My_AddToLog("// "+ strTitle +": "+strDateTime);
My_AddToLog("///////////////////////////////////////////////////////////////////////////////");
else
bResult = FALSE;
endif;

return bResult;
end;

///////////////////////////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////////////////////////
function My_AddToLog(strValue)
begin
if m_hLogFile != 0 then
WriteLine(m_hLogFile, strValue);
endif;
end;

///////////////////////////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////////////////////////
function My_CloseLogFile()
NUMBER nvTemp;
STRING strDateTime;
STRING strTemp;
begin
///////////////////////////////////////////////////////////////////
// Close The UpgradeList.txt File //
///////////////////////////////////////////////////////////////////
GetSystemInfo(DATE, nvTemp, strDateTime);
GetSystemInfo(TIME, nvTemp, strTemp );
strDateTime = strDateTime +" "+ strTemp;
My_AddToLog("");
My_AddToLog("///////////////////////////////////////////////////////////////////////////////");
My_AddToLog("// Close Log File... "+strDateTime);
My_AddToLog("///////////////////////////////////////////////////////////////////////////////");
if (CloseFile(m_hLogFile) < 0) then
return FALSE;
else
m_hLogFile = 0;
endif;
end;

///////////////////////////////////////////////////////////////////////////////
// //
// T H E E N D ? //
// //
///////////////////////////////////////////////////////////////////////////////
#endif
[/CODE]

How to use
#include "ifx.h"
#include "My_Log.h"

function OnBegin()
begin
My_OpenLogFile("My Product Name", "LogFile_Name.log");

My_AddToLog("This is a log file test...");

end;

function OnEnd()
begin
My_CloseLogFile();
end;

#include "My_Log.rul"


Explanation:

There are three functions to be concerned about.
My_OpenLogFile
My_AddToLog
My_CloseLogFile

My_OpenLogFile --
When the log file is created, it will be placed in the Temp directory of the user who is installing it. For example, "C:\Documents and Settings\UserName\Local Settings\Temp". It gets this information by grabing the "TEMP" envrioment variable. If the call failes, the location of the log file is hard coded to be, "C:\".

My_AddToLog --
Adds a single string to the end of the log file.

My_CloseLogFile --
Close the log file.

I hope this works for you...
0 Kudos
jchristman
Level 8

Yes, this will, it is very clean and similar to what I was doing with vbscripts logging extra work taking place in my MSI projects. This is the first time using an Installscript project and is new and differant, but i like the control I have better. Thank you for the code! 🙂
0 Kudos
TheTraveler
Level 8

You are welcome...

Just to let you know, this code has worked for me since Install Shield 6. So it is backward compatible and seems to be able to be used in the current versions of Install Shield.
0 Kudos
jchristman
Level 8

Thank you for your help.

I am going over the code to see about adding in an Error Log ability so one can write all data to a main log file and also only write errors to an error log that can be presented at the end.
0 Kudos
jchristman
Level 8

Looking for a way to log if files are not copied over during the install process. I have dlls that seem to not always get updated depending on if IIS is stopped or not. Is there a way to see if it was copied successfully or if it fails to be copied to the .
0 Kudos
joshstechnij
Level 10 Flexeran
Level 10 Flexeran

There are various transfer events you could override in your script to determine if a file is being installed, such as OnInstallingFile and OnInstalledFile. The OnFileLocked, OnFileReadOnly, and OnFileError events provide some additional detail that could help determine if there was some issue encountered while installing a file.
0 Kudos
jchristman
Level 8

I was using these 2 events (OnInstallingFile and OnInstalledFile) but it slowed down my installation bad when logging everything so I was looking to just log errors. So I think I will try the addtional events you mentioned. Thank you for the information, this will help a great deal.
0 Kudos
jchristman
Level 8

Ok, I guess I need help on where everything is called, I was trying to use featureevents like MyFeature1_Installing(), MyFeature1_Installed(), MyFeature2_Installing() and MyFeature2_Installed().

I wrote to the logs in each one something like this.


function MyFeature1_Installing()
begin
writeToLog("Preparing MyFeature1 for Installation");
end;
function MyFeature1_Installed()
begin
writeToLog("MyFeature1 Installation completed");
My_PerformTasks1();
end;
function MyFeature2_Installing()
begin
writeToLog("Preparing MyFeature2 for Installation");
end;
function MyFeature2_Installed()
begin
writeToLog("MyFeature2 Installation completed");
My_PerformSomeTasks2()
end;


except it seems to write all of these out before it even starts to copy the files for MyFeature1. How or where should I do things since these functions seem to be called prior to the actual feature being installed.
0 Kudos
jchristman
Level 8

I got this fixed it is working correctly now, I somehow got the components moved into the second feature instead of the first. So the way I have it is correct.
0 Kudos