我有三个目标——引擎、任务和错误。请在下面找到他们的 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 目标?
编辑
如果我可以指定记录消息,则可以达到预期的效果,但如果它们是错误或致命的(因为它们已经被记录),则不能。