1

我有三个目标——引擎、任务和错误。请在下面找到他们的 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)
  • 除了各自的专用目标之外,所有错误(引擎和任务)都记录到同一个错误日志中。
  • 一个命名空间同时记录到引擎和任务 (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 目标?

编辑

如果我可以指定记录消息,则可以达到预期的效果,但如果它们是错误或致命的(因为它们已经被记录),则不能。

4

1 回答 1

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" />
于 2013-06-24T15:44:04.583 回答