イベントログにlog4netを使ってログを書きたいのだが、今の業務仕様では、決められたイベントIDを書くように指示されている。しかし、標準のEventLogAppenderには、そのような指定をする機能が無いようだ。
とりあえず検索検索♪以下のURLの情報を見つける。
http://www.mail-archive.com/log4net-user@logging.apache.org/msg02074.html
ソースに入っているイベントID用のエクステンションを使えばいいそうな。どうやって使うのだろう?*1とりあえずソースをビルドしてモノを作る。Releaseバージョンを作ろうと思うと、厳密名を設定するためのキーが無いと叱られた。Log4Netのソースを探すと、以下のようなドキュメントを発見。
log4net Strong Name Key Readme ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The log4net release builds are strongly named using the log4net.snk key file. This file is not distributed as part of the log4net source or binary downloads. See the log4net documentation for more details. Before you can build your own release builds you will need to generate a strong name key that identifies your assemblies. Generating your own strong name key. Run the SN utility from the .NET Framework SDK as follows: sn -k log4net.snk A new strong name key pair will be created and written to the log4net.snk file.
配布はできないから自分で作れと。はいはい。sn.exeは、「C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin」にあるので、コマンドプロンプトでパスを通してさくっと実行。実行したフォルダにlog4net.snkが生成される。それをlog4netの「extensions\net」フォルダに置くと、問題なくビルドできた。
次、テストプログラムにできあがったDLL(log4net.Ext.EventID.dll)への参照を追加し、GetLoggerを使うところの記述を以下のように変えてみる。
'logger = LogManager.GetLogger(loggerName) logger = EventIDLogManager.GetLogger(loggerName)
お、使えそうだ。次はどうするのだろう?
...何も拡張されていないし。と思ってもう一度文章を読み直すと、EventIDLogManagerが返すのは、IEventIDLogインターフェイスを持つオブジェクト。上記のサンプルのソース冒頭では、loggerオブジェクトをILogとして宣言してしまっていたので、受け取った瞬間に拡張された機能がそぎ落とされていたようだ。loggerの宣言部を下記のように変えると、ログ出力メソッドのオーバーロードが2つ増えた。
Private Shared logger As IEventIDLog
*1:きちんとドキュメントを読んでから使い始めろという指摘はとりあえず勘弁