misc.log

日常茶飯事とお仕事と

log4netでイベントログに書く際のイベントID

イベントログに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:きちんとドキュメントを読んでから使い始めろという指摘はとりあえず勘弁