启用Wix安装程序中的日志记录功能

14

如何在我的wix项目中启用日志记录并设置MsiLogFileLocation?

现在我正在使用以下命令行参数运行我的install.msi:

msiexec /i install.msi /l*v InstallLog.log

我希望在没有任何参数的情况下始终记录我的工作。是否有任何方法可以做到这一点?

1个回答

26

您可以这样告诉WiX使用详细日志:

<Property Id="MsiLogging" Value="v" />

但是,你无法指定文件写入的位置 - msiexec在WiX设置属性到达时已经确定了。它将默认为%TEMP%\MSI{随机字符}.LOG。你可以为用户提供一个复选框来决定是否要打开该日志,例如(假设你正在使用内置的InstallDir UI模板 - 其他模板也可能可以,但这是一个非常简单的示例):

<Property Id="MsiLogging" Value="v" />

<UI>
  <UIRef Id="WixUI_InstallDir" />
  <Publish Dialog="ExitDialog"
  Control="Finish"
  Event="DoAction"
  Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
</UI>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="View Installation Log" />

<WixVariable Id="WixUILicenseRtf" Value="license.rtf"/>

<Property Id="WixShellExecTarget" Value="[MsiLogFileLocation]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

这将会把日志文件复制到一个在游戏尽可能晚的时间内的目录,但会错过至少一些日志的结尾部分。
<Property Id="MsiLogging" Value="v!" />
<CustomAction Id="CopyLog" Execute="immediate" 
              ExeCommand="cmd /c copy [MsiLogFileLocation] C:\temp\log.txt" 
              Directory="TARGETDIR" 
              Impersonate="no" 
              Return="asyncNoWait" />

<InstallExecuteSequence>
     <Custom Action="CopyLog" OnExit="success" />
</InstallExecuteSequence>

请注意,这无法适用于C:驱动器根目录,因为它需要管理员权限。如果您可以接受丢失更多日志,可以将OnExit ='success'更改为After ='InstallFinalize',并将CustomAction上的Execute属性更改为commit,这应该允许其以管理员身份运行。
有关更多信息,请参见此讨论:http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Setting-MsiLogFileLocation-property-td7374335.html

嗯...我已经能够将日志复制,但是它会在整个日志完成之前就进行复制 - 因为日志包含有关复制的自定义操作的信息。不确定这是否真正符合您的要求。我仍然认为最好的方法是只显示日志,让用户将其保存到其他地方。 - Dan Field
你说得对,我需要复制日志而不是向用户显示它们。它们不完整并不是问题。 - Anton23
更新的答案。再次提醒,这将会截断副本中的一些日志信息。 - Dan Field
“v!”是什么意思? - Anton23
v! 在写日志时强制刷新流的频率更高。 - Dan Field
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接