NLog:如何从两个不同的目标向控制台发送日志消息而不重复?

时间:2013-06-24 14:49:35

标签: nlog

我有三个目标 - 引擎,任务和错误。请找到他们的NLog配置:

<targets>
  <target name="EngineLog" xsi:type="File" fileName="C:\Log\EngineLog.txt" layout="${layout}"/>
  <target name="ErrorLog" xsi:type="File" fileName="C:\Log\ErrorLog.txt" layout="${layout}"/>
  <target name="TasksLog" xsi:type="File" fileName="C:\Log\TasksLog.txt" layout="${layout}"/>
  <target name="ConsoleLog" xsi:type="ColoredConsole" layout="${consoleLayout}"/>
</targets>
<rules>
  <logger name="*" minLevel="Error" writeTo="ErrorLog"/>

  <logger name="N1.*" minLevel="Warn" writeTo="EngineLog" final="true"/>
  <logger name="N2.*" minLevel="Info" writeTo="EngineLog" final="true" />
  <logger name="N3.*" minLevel="Info" writeTo="EngineLog" final="true" />
  <logger name="N4.*" minLevel="Info" writeTo="EngineLog" final="true" />
  <logger name="N5.*" minLevel="Info" writeTo="EngineLog" final="true" />

  <logger name="N6" minLevel="Info" writeTo="EngineLog" />
  <logger name="*" minlevel="Info" writeTo="TasksLog" />
</rules>

当然,真正的命名空间名称不是N1 ... N6,重要的是我有:

  • 5个名称空间,专门记录到引擎日志(N1-N5)
  • 除了相应的专用目标外,所有错误(引擎和任务)都会记录到相同的错误日志中。
  • 将一个命名空间记录到Engine和Tasks(N6)
  • 其余部分被视为任务

现在我还希望将所有进入ErrorLog或TasksLog的内容记录到控制台。

我的第一次尝试是使用SplitGroup将ErrorLog和TasksLog包装在一起,将每个目标与控制台目标分组,如下所示:

<target name="ErrorLog" xsi:type="SplitGroup">
  <target xsi:type="File" fileName="C:\Log\ErrorLog.txt" layout="${layout}"/>
  <target xsi:type="ColoredConsole" layout="${consoleLayout}"/>
</target>
<target name="TasksLog" xsi:type="SplitGroup">
  <target xsi:type="File" fileName="C:\Log\TasksLog.txt" layout="${layout}"/>
  <target xsi:type="ColoredConsole" layout="${consoleLayout}"/>
</target>

但这是一种错误的方法,因为每个错误都会在控制台上记录两次 - 首先代表ErrorLog,然后代表TasksLog。

如何在没有重复的情况下将错误记录到控制台,同时允许它们同时转到ErrorLog目标和TasksLog / EngineLog目标?

修改

如果我可以指定记录消息,则可以实现所需的效果,但如果它们是错误或致命的话,则不会达到预期的效果(因为这些已被记录)。

1 个答案:

答案 0 :(得分:4)

好的,我想我找到了解决方案:

<target name="ErrorLog" xsi:type="SplitGroup">
  <target xsi:type="File" fileName="C:\Log\ErrorLog.txt" layout="${layout}"/>
  <target name="ConsoleLog" xsi:type="ColoredConsole" layout="${consoleLayout}"/>
</target>

最后添加以下规则:

<logger name="*" levels="Warn, Info, Debug, Trace" writeTo="ConsoleLog" />