Install log file is missing
You can specify a path to the log file by the setup /LOG="filename"
command line parameter. So to log e.g. to the C:\FileName.log
file run your setup this way:
Setup.exe /LOG="C:\FileName.log"
If you don't specify the above command line parameter, the log will be saved to the temporary directory into the file with the following name pattern:
Setup Log YYYY-MM-DD #NNN.txt
Where:
YYYY - current system time year
MM - current system time month
DD - current system time day
NNN - number unique for each day starting from 1
It's like TLama describes, if you don't state the logfile's destination as a command line parameter then it will land up in the temp folder. Below is some code that I use for copying the logfile at the DeinitializSetup event for Installer and for the Uninstaller's DeinitializUninstall event.
Installer
After instalation the logfile is copied from the temp folder and placed it into one of choice. It handles some cases of pre-mature termination.
function MoveLogfileToLogDir():boolean;
var
logfilepathname, logfilename, newfilepathname: string;
begin
logfilepathname := expandconstant('{log}');
//If logfile is disabled then logfilepathname is empty
if logfilepathname = '' then begin
result := false;
exit;
end;
logfilename := ExtractFileName(logfilepathname);
try
//Get the install path by first checking for existing installation thereafter by GUI settings
if IsAppInstalled then
newfilepathname := GetInstalledPath + 'Log\Installer\'
else
newfilepathname := expandconstant('{app}\Log\Installer\');
except
//This exception is raised if {app} is invalid i.e. if canceled is pressed on the Welcome page
try
newfilepathname := WizardDirValue + '\Log\Installer\';
except
//This exception is raised if WizardDirValue i s invalid i.e. if canceled is pressed on the Mutex check message dialog.
result := false;
end;
end;
result := ForceDirectories(newfilepathname); //Make sure the destination path exists.
newfilepathname := newfilepathname + logfilename; //Add filename
//if copy successful then delete logfilepathname
result := filecopy(logfilepathname, newfilepathname, false);
if result then
result := DeleteFile(logfilepathname);
end;
//Called just before Setup terminates. Note that this function is called even if the user exits Setup before anything is installed.
procedure DeinitializeSetup();
begin
MoveLogfileToLogDir;
end;
Uninstaller
Logging in the Uninstaller is activated by passing "/Log" command line parameter to uninstall.exe. Append this to uninstaller's path in the registry. Cavet: this method will only work if uninstalled from Control Panel (i.e. it won't work if uninstall.exe is excecuted directly)
function EnableUninstallerLogging():boolean;
var Key : string; //Registry path to details about the current installation (uninstall info)
Value : string;
begin
//If logfile is disabled then logfilepathname is empty
if expandconstant('{log}') = '' then begin
result := false;
exit;
end;
Key := GetAppUninstallRegKey;
Value := 'UninstallString';
if RegValueExists(HKEY_LOCAL_MACHINE, Key, Value) then
result := RegWriteStringValue(HKEY_LOCAL_MACHINE, Key, Value, ExpandConstant('"{uninstallexe}" /Log'));
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall : ;
ssPostInstall : begin
//Enable logging during uninstall by adding command line parameter "/Log" to the uninstaller's reg-path
EnableUninstallerLogging;
end;
ssDone : ;
end;
end;
//Called just before Uninstaller terminates.
procedure DeinitializeUninstall();
begin
MoveLogfileToLogDir;
end;
Generic Functions
Some common functions I use in the sample code above:
function GetAppID():string;
begin
result := ExpandConstant('{#SetupSetting("AppID")}');
end;
function GetAppUninstallRegKey():string;
begin
result := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetAppID + '_is1'); //Get the Uninstall search path from the Registry
end;
function IsAppInstalled():boolean;
var Key : string; //Registry path to details about the current installation (uninstall info)
begin
Key := GetAppUninstallRegKey;
result := RegValueExists(HKEY_LOCAL_MACHINE, Key, 'UninstallString');
end;
//Return the install path used by the existing installation.
function GetInstalledPath():string;
var Key : string;
begin
Key := GetAppUninstallRegKey;
RegQueryStringValue(HKEY_LOCAL_MACHINE, Key, 'InstallLocation', result);
end;