Problem

NLogはシンプルで使いやすいです。
個人的にはlog4netよりもシンプルで使いやすくて好きです。

そんなNLogで、複数のLoggerを準備している際に問題が起きました。
下記のようなNLog.configです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets>
<target name="ABC" xsi:type="File" fileName="file.txt" />
<target name="DEF_" xsi:type="File" fileName="file.txt" />
<target name="GHI" xsi:type="File" fileName="file.txt" />
</targets>

<rules>
<logger name="ABCLogger" minlevel="Info" writeTo="ABC" />
<logger name="DEFLogger" minlevel="Trace" writeTo="DEF" />
<logger name="GHILogger" minlevel="Trace" writeTo="GHI" />
</rules>
</nlog>

このファイルをアプリと一緒に読み込み、LogManager.GetLogger(“GHILogger”); と実行してもログを書き出すことができません。
しかもエラーも発生しません。

Solution

ポイントは、targets内の、targetセクションにおいて、rules内のloggerセクションのwriteTo属性と対応付けすることが出来ないtargetが存在することになります。
つまり、DEF_ がそれです。
このため、NLogの内部では処理がおかしくなっているのか、ABCLogger は読み込めますが、次の DEFLogger は対応付く DEF が存在しないため読み込めません。
さらに不味いのは、この状態だと後続の GHILogger も読めません。
途中で対応付けに失敗すると、それ以降の対応付けに失敗あるいは対応付けそのものを中止してしまうのでしょう。

対応は簡単です。

targetのname属性またはloggerのwriteTo属性を正しく対応付けるように修正するだけです。
この場合は、2番目のtargetのname属性を DEF に修正することで正しく動きます。
仕事で、ログが出力されなくて悩みましたが、一見無関係に見える、使っていないLoggerが影響するとは思いませんでした。