Nlog在Windows服务中无法写入日志文件

5

我有一个用.NET 4.0编写的Windows服务,并在Local System凭据下安装了它。在代码中,我使用了NLog。

private static Logger logger = LogManager.GetCurrentClassLogger();
logger.Debug("some information");

我也将nlog.config复制到与exe文件相同的目录中。
<?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" type="File"
            fileName="c:\log\TestService\My.log"
            layout="${longdate}::${logger}::${message}"
            keepFileOpen="false" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" maxLevel="Deubg" writeTo="logfile" />
  </rules>
</nlog>

但是,如果我启动服务,我根本看不到日志文件已经被创建了。 如果我将 log.Debug 代码替换为 Debug.WriteLine 并使用我的 Visual Studio 附加到 Windows 服务进程进行调试,我可以看到输出窗口有我的调试信息,这意味着我的 Windows 服务代码是正确的。
我的 nlog 代码有问题吗?
--更新1--
我更新了 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" type="File"
            fileName="c:\log\TestService\My.log"
            layout="${longdate}::${logger}::${message}"
            keepFileOpen="false" />
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>

并且我修改了我的代码为

logger.Trace("some information");

然后它就可以工作了。我不确定我的第一组配置有什么问题。

我猜LocalSystem没有该文件夹的写入权限。 - Dirk
乍一看,我会说你的目标标签应该长这样:<target name="logfile" xsi:type="File" fileName="C:/log/TestService/My.log" layout="${longdate}::${logger}::${message}" keepFileOpen="false" />否则:你有一个独立的NLog.config文件,对吧?如果是这样,它可能没有被构建(在你的/bin目录中)--> 所以服务将找不到它所需的配置!在这里看看。 - Matthias R.
@Matt,请看我上面更新的问题,我不太明白调试和跟踪之间有什么区别。 - hardywang
5
确定一下:你是否注意到了你第一次尝试中的拼写错误?其中 <logger name="*" minlevel="Info" maxLevel="Deubg" writeTo="logfile" /> 应该实际上是 maxLevel="Debug" - Matthias R.
@Matt,干得好!!这可能是问题所在。 - hardywang
从 https://github.com/NLog/NLog/wiki/Log-levels - Trace 日志级别低于 Info 日志级别。 - Henry Aloni
1个回答

10

更新

<logger name="*" minlevel="Info" maxLevel="Deubg" writeTo="logfile" />
                                           ^^^^^

首先需要指出的是:Debug 的拼写错误。

但主要问题在于 Debug 级别低于 info 级别

以下是允许的日志级别(按降序排列):

  • off(最高级别,关闭所有记录。)
  • fatal(致命错误。)
  • error(错误。)
  • warn(警告。)
  • info(信息。)
  • debug(调试信息。)
  • trace(最详细的信息。)

nlog 文档链接


1
更深入了解何时使用哪个日志级别,请参阅NLog文档 - Matthias R.
3
首先,"Frist" 的拼写错误。如果在指出 "debug" 中的字符被调换时故意将 "first" 中的字符调换,那么这个做法是聪明而巧妙的。 - Dave Rael

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