How to set or get all logs in a custom bootstrapper application

一个人想着一个人 提交于 2019-12-19 03:55:16

问题


In my custom Burn managed bootstrapper application, I want a way to set the default log directory of the installer so that customers can easily find the installation logs. If this can't be done, I would like a suitable way to copy the log files after installation.

I tried unsuccessfully at setting the WixBundleLog variable in my setup project (i.e. Bundle.wxs) and in my managed bootstrapper application. Also, my bootstrapper applicaton is generic enough so that it my be used with a variety of products / install packages, so I need a solution that is flexible enough to set / get the installation logs for each package, without hard-coding the package name in my bootstrapper application.

It seems there should be a way to do this without forcing the user to use "-l" or "-log" on the command line.


回答1:


WixBundleLog is the burn variable that specifies the log file. It is not possible to override it in the bundle because you cannot set a variable in a bundle that contains the "Wix" prefix. Overriding it in the bootstrapper application doesn't work either because the bootstrapper continues to log to its default.

The burn bootstrapper sets string variables for the bootstrapper log and the installation package logs. I keep track of these variables in a list. So in my constructor I have something like:

this.LogsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), @"Company_Name\Logs\Installer\", DateTime.Now.ToString("yyyyMMdd_hhmmss"));
_logVariables = new List<string>();
_logVariables.Add("WixBundleLog");

Burn sets string variables for the log files in the format [WixBundleLog]_PackageId. In my bootstrapper application when the PlanPackageComplete event is fired, I have an event handler that includes the following code to add the variables to my list.

//set *possible* log variables for a given package
_logVariables.Add("WixBundleLog_" + e.PackageId);
_logVariables.Add("WixBundleRollbackLog_" + e.PackageId);

At the end of installation or if my bootstrapper encounters an error, I call the following method:

private void CopyLogs()
{
     if (!Directory.Exists(this.LogsDirectory))
         Directory.CreateDirectory(this.LogsDirectory);

     foreach (string logVariable in _logVariables)
     {
         if (this.Bootstrapper.Engine.StringVariables.Contains(logVariable))
         {
             string file = this.Bootstrapper.Engine.StringVariables[logVariable];
             if (File.Exists(file))
             {
                 FileInfo fileInfo = new FileInfo(file);
                 fileInfo.CopyTo(Path.Combine(this.LogsDirectory, fileInfo.Name), false);
             }
         }
     }
 }


来源:https://stackoverflow.com/questions/10741139/how-to-set-or-get-all-logs-in-a-custom-bootstrapper-application

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!