我有三个目标 - 引擎,任务和错误。请找到他们的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,重要的是我有:
现在我还希望将所有进入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目标?
修改
如果我可以指定记录消息,则可以实现所需的效果,但如果它们是错误或致命的话,则不会达到预期的效果(因为这些已被记录)。
答案 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" />