NLog似乎没有在ClickOnce环境中登录,但在开发中工作

本文关键字:登录 工作 开发 ClickOnce NLog 环境 | 更新日期: 2023-09-27 18:08:34

我通过NLog在我的应用程序中执行日志。我试图收集一些日志来诊断我在一台机器上遇到的一个奇怪的问题。在我的NLog里。我有以下配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target name="logfile" xsi:type="File" fileName="${specialfolder:dir=PollingLogs:file=log.txt:folder=MyDocuments}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</nlog>

当我在我的开发机器上运行时,我得到一个在我的文档文件夹中创建的log.txt文件,所有日志记录都正确发生。然而,当我使用ClickOnce部署应用程序时,没有创建log.txt文件(至少我可以找到)。没有错误发生,我的应用程序正常运行,但没有任何事情发生。

我被如何调试这个问题难住了。有没有人有任何见解,他们可以分享,以帮助我得到NLog在点击一次的环境中正确工作?

作为参考,我的项目中的NLog引用被设置为copy local

NLog似乎没有在ClickOnce环境中登录,但在开发中工作

我知道这有点晚了,但这里描述了另一个解决方案:从代码中使用XML配置log4net或NLog虽然它在回答另一个问题。

我遇到了KallDrexx描述的相同问题。我不满意多个NLog配置文件浮动(在同一解决方案中的多个项目),所以创建了一个NLogHelper类,它有一个方法返回配置:

    public static XmlLoggingConfiguration SetNlogConfiguration()
    {
        var sr = new StringReader(NlogXmlConfigString1());
        var xr = XmlReader.Create(sr);
        var config = new XmlLoggingConfiguration(xr, null);
        return config;
    }

一个单独的方法只返回xml字符串,在我的例子中:

    private static string NlogXmlConfigString1()
    {
        return  @"<nlog xmlns='http://www.nlog-project.org/schemas/NLog.xsd''
                       xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance''>
                  <targets>
                       <target name='logfile' xsi:type='File' fileName='${specialfolder:file=My_Logger.txt:folder=Desktop}' />
                  </targets>
                  <rules>
                    <logger name='*' minlevel='Info' writeTo='logfile' />
                  </rules>
                 </nlog>";
    }

最后,我在相关的类构造函数中设置了配置:

    NLog.LogManager.Configuration = NlogHelper.Helper.SetNlogConfiguration();

显然,它可以重构,并且如果需要,可以将日志文件名等项作为参数传递。配置xml可以替换为您的任何配置。似乎还提供了在运行时轻松指定选择的多个配置的可能性。

我喜欢它,因为我发现它让我在代码和部署期间更好地控制NLog配置。

我找到了这个问题的答案,当你的NLog.config不会被复制到你的程序,如果使用ClickOnce安装。

您需要在使用Solution ExplorerProject中选择NLog.config文件,并设置其Properties如下:

Build Action: Content

复制到输出目录:始终复制

现在,当您使用ClickOnce部署时,这些文件也应该被复制过来!:)

使用Sysinternal ProcessMon (free)进行调试。它可以向您显示进程所尝试/制作的文件访问…

对于这种类型的日志,我建议使用ApplicationDataCommonApplicationDataLocalApplicationDataEnvironment.SpecialFolder而不是MyDocuments

我今天做的一个项目遇到了这个问题。

NLog。配置文件被复制到你的构建目录,所以它很好,当你从那里运行它, ClickOnce安装程序是而不是部署NLog。

安装时的配置文件。

这解释了你所看到的行为:当从安装的副本运行时,它只是没有任何日志配置。

到目前为止,我发现的唯一解决方案是将日志配置合并到您的app.config文件中,因为exe。配置文件确实由ClickOnce部署-我没有太多的乐趣尝试添加NLog。