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

时间:2011-09-13 18:57:47

标签: c# deployment clickonce nlog

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

<?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在clickonce环境中正常工作?

作为参考,我项目中的NLog参考设置为复制本地。

4 个答案:

答案 0 :(得分:4)

我知道这有点晚了,但这里有另一个解决方案:Configure log4net or NLog with XML from code  虽然它正在回答另一个问题。

我遇到了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配置。

答案 1 :(得分:4)

如果使用NLog.config安装ClickOnce,则NLog.config无法复制到您的程序中,我找到了此问题的答案。

您需要使用ProjectSolution Explorer中选择Properties文件,并按如下所示设置其ClickOnce

构建操作:内容

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

现在,当您使用{{1}}进行部署时,也应该复制文件! :)

答案 2 :(得分:2)

要调试此用途Sysinternal ProcessMon(免费)。 它可以向您展示尝试/制作过程的文件访问...

对于此类日志,我建议您使用ApplicationDataCommonApplicationDataLocalApplicationData来自Environment.SpecialFolder而非MyDocuments ...

答案 3 :(得分:0)

我用今天正在处理的项目来解决这个问题。

NLog.config文件将被复制到您的构建目录中,因此从那里运行它很好, ClickOnce安装程序部署NLog.config安装软件时提交文件。

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

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