エンジン、タスク、エラーの 3 つのターゲットがあります。以下の 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)
- すべてのエラー (エンジンとタスクの両方) は、それぞれの専用ターゲットに加えて、同じエラー ログに記録されます。
- 1 つの名前空間がエンジンとタスクの両方に記録されます (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>
しかし、これは間違ったアプローチです。すべてのエラーがコンソールに 2 回記録されるためです。最初は ErrorLog に代わって、次に TasksLog に代わって記録されます。
エラーが ErrorLog ターゲットと TasksLog/EngineLog ターゲットの両方に移動できるようにしながら、エラーを重複せずにコンソールに記録するにはどうすればよいですか?
編集
メッセージをログに記録するように指定できれば、目的の効果が得られますが、メッセージがエラーまたは致命的である場合はそうではありません (これらは既にログに記録されているため)。