首页 > 解决方案 > 使用 NLog 仅将错误记录到 StdErr 输出流

问题描述

NLog 支持将error="true"键值对添加到targetXML 节点,如下所述:https ://github.com/NLog/NLog/wiki/Console-target

但是,我注意到这会将所有日志输出到 StandardError 流,而不仅仅是Error级别日志。

例如,当我添加error="true"键值对时,这两条日志行都将转到 stderr:

logger.Info("This should not go to stderr... but it does!");
logger.Error("This works!");

如何使 NLog 仅将错误输出到 stderr 流,而不是所有日志?

为了完整起见,这是我的 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="logconsole" xsi:type="Console" error="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
  </rules>
</nlog>

标签: .netnlognlog.config

解决方案


到该error="true"目标的所有消息都将发送到错误流。

仅对于错误事件,您需要两个目标;一种用于错误流和非错误流。使用两条规则,您可以将事件发送到正确的目标。

例如:

<?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="logconsoleError" xsi:type="Console" error="true" />
    <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Error" writeTo="logconsoleError" final="true" />
    <logger name="*" minlevel="Info" writeTo="logconsole" />
  </rules>
</nlog>

请注意我在这里使用该final属性,否则信息和警告日志将被发送到两个目标。


推荐阅读