1

エンジン、タスク、エラーの 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 ターゲットの両方に移動できるようにしながら、エラーを重複せずにコンソールに記録するにはどうすればよいですか?

編集

メッセージをログに記録するように指定できれば、目的の効果が得られますが、メッセージがエラーまたは致命的である場合はそうではありません (これらは既にログに記録されているため)。

4

1 に答える 1

4

OK、解決策を見つけたと思います:

<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 に答える