A certain engineer "COMPLEX"

開発メモ その71 NLogでLoggerの読み込みに失敗する

Problem


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

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


<?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が影響するとは思いませんでした。

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。