log4net ErrorHandler拡張
C#を使って開発案件に携わるとき、ログのように「毎回使うもの」に困ることが多い。
何度も使ってるのだから見積もりは下げられそうなものだけど、
毎回異なる作りをするから結局工数はそのまま。
ログのオープンソースで成熟しているものはないの?
こういう流れでlog4netを使ってみることになりました。
どうやらstableなのはlog4net 1.2.10のようです。
ここから手に入ります。
http://logging.apache.org/log4net/download.html
ただし、このlog4netに罠が1つある・・・。
log4net内でエラーとなった場合、以下のエラーハンドラが呼ばれること。
log4net.Util.OnlyOnceErrorHandler
だいたい名前から想像できるように、1回しかチャレンジしない。
それ以降は握りつぶされてしまう。
きちんと作ったアプリケーションだと問題ない。
でも、気づかないうちに致命的なエラーを無視しているかもしれない。
log4netの設定が1つ悪いだけで、複数スレッドからのファイルの掴み合いが発生するしね。
ということで、このlog4netの拡張してみましょ。
namespace Yoshinani.Diagnostics
{
public class YoshinaniErrorHandler : IErrorHandler
{
public void Error(string message)
{
}
public void Error(string message, Exception e)
{
}
public void Error(string message, Exception e, ErrorCode errorCode)
{
}
}
}
拡張は、IErrorHandlerを実装したエラーハンドラを作成し、3つのErrorメソッドを定義すれば良い。
実装はお好みでどうぞ。
うちの場合は普段とは別のファイルに保存するロジックを書きました。
この「普段とは別のファイル」に何か書き込まれてたらlog4netの中でエラーが発生しているということ。
作成したら以下のようにConfigファイルに定義してあげる。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="YoshinaniLogFileApender" type="log4net.Appender.RollingFileAppender">
<!-- ここに色々な定義をする。ぶっちゃけここの設定が命なので注意してね-->
<errorHandler type="Yoshinani.Diagnostics.YoshinaniErrorHandler" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="YoshinaniLogFileApender" />
</root>
</log4net>