我有一个 ClickOnce 部署的 WinForms 应用程序。用户可以启动应用程序的多个实例。每个实例都应该写入一个单独的日志文件。我需要能够在运行时发现当前实例的日志文件,以便我可以使用它来发送崩溃报告等。
现在我无法绕过多个实例的要求。 (他们真正需要的是选项卡式 UI,但这是遗留应用程序的一大困惑,我现在无法实现它。)
通常日志记录有效,但单独的应用程序实例会覆盖同一个文件。
我试图在日志文件名中添加时间戳,但这没有用:
<target name="logfile" xsi:type="File"
fileName="${specialfolder:folder=ApplicationData}/MyCompany/CRM/crm_${longdate}.log"
deleteOldFileOnStartup ="true"
layout="${longdate} ${message} ${exception:format=tostring}"/>
这可能吗?
最佳答案
在您的应用程序的上下文中,您能否知道该实例的有效(且有意义的)名称?是否可以使用代表应用程序名称的命令行参数启动多个实例?如果您可以“知道”应用程序的有用名称,那么您可以将该名称存储在 GlobalDiagnosticsContext 中并使用 GlobalDiagnosticsContext LayoutRenderer 来构建您的文件名。
因此,您的配置可能如下所示:
<target name="logfile" xsi:type="File"
fileName="${specialfolder:folder=ApplicationData}/MyCompany/CRM/crm_${gdc:item=application}.log"
deleteOldFileOnStartup ="true"
layout="${longdate} ${message} ${exception:format=tostring}"/>
在您的应用程序启动逻辑中,您可以像这样设置 gdc:
GlobalDiagnosticsContext.set("application", GetApplicationNameFromCommandLineArgs());
每个应用程序将写入自己的日志文件,根据命令行参数命名。
祝你好运!
关于.net - 将 NLog 与多个应用程序实例一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27607834/