.net - 将 NLog 与多个应用程序实例一起使用

标签 .net clickonce nlog

我有一个 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/

相关文章:

ClickOnce 通过编程更新但不是框架更新因无效 list 错误而失败

deployment - 保护单击一次Web部署的安装

c# - NLog 不从引用的 dll 写入

c# - RavenDb NLog 配置冲突

c# - Serilog 解构运算符 - 它是否在日志级别检查之前解构

c# - 如何防止 Linq DataContext.ExecuteQuery 修改数据

clickonce - 自定义 clickonce 下载屏幕

azure - “ILoggingBuilder”不包含 'AddNLog' 的定义,并且没有扩展方法 'AddNLog' 接受类型为 'ILoggingBuilder' 的第一个参数

c# - 使控制台应用程序的行为类似于 Windows 应用程序

c# - try catch