如何设置或获取自定义引导程序应用程序中的所有日志

在我自定义的Burn托管引导程序应用程序中,我想要一种方法来设置安装程序的默认日志目录,以便客户可以轻松找到安装日志。如果这不能完成,我想要一个合适的方式来安装后复制日志文件。

我在设置项目(即Bundle.wxs)和我的托管引导程序应用程序中设置WixBundleLog变量时尝试失败。此外,我的引导程序applicaton足够通用,因此它可以用于各种产品/安装程序包,所以我需要一个足够灵活的解决方案,以便为每个程序包设置/获取安装日志,而无需对程序包名称进行硬编码在我的启动应用程序中。

看起来应该有一种方法可以在不强制用户在命令行上使用“-l”或“-log”的情况下执行此操作。

0
额外 编辑
意见: 1

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.

刻录引导程序为引导程序日志和安装程序包日志设置字符串变量。我将这些变量记录在列表中。所以在我的构造函数中,我有这样的东西:

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

刻录以[WixBundleLog] _PackageId格式设置日志文件的字符串变量。 在我的引导程序应用程序中,当触发 PlanPackageComplete 事件时,我有一个事件处理程序,其中包含以下代码以将变量添加到列表中。

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

在安装结束或者我的引导程序遇到错误时,我会调用以下方法:

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);
             }
         }
     }
 }
0
额外
从WixBundleLog获取目标日志路径不是很容易,然后从该路径和文件目录中获取没有前缀的文件名,稍后我们可以获取目录中的所有文件,并以保存的文件名开头并复制它们?
额外 作者 Vladimir Arustamian,