Log4Netでエラーのハンドリングを行なう方法

環境
Log4Net 1.2.10 for .NET Framework 1.1
WindowsXP + VisualStudio2003 + VB.NET


例えば、FileAppender を利用してファイルにログを出力している時にファイルがロックされたり
出力先がリモートフォルダでネットワークが切断されてしまった場合にログが吐けないがエラーが検知できない。
(まあ、他の Appender と併用すれば言いと言う話もあるけどね。)

まずは、log4net.Core.IErrorHandler インターフェースを実装したクラスを作成する。

Public Class Log4Net_ErrorHandler 
    Implements log4net.Core.IErrorHandler 

    Public Overloads Sub [Error](ByVal message As String) Implements log4net.Core.IErrorHandler.Error 
        Throw New Exception(message) 
    End Sub 

    Public Overloads Sub [Error](ByVal message As String, ByVal e As System.Exception) _
                Implements log4net.Core.IErrorHandler.Error 
        Throw New Exception(message, e) 
    End Sub 

    Public Overloads Sub [Error](ByVal message As String, ByVal e As System.Exception, _
         ByVal errorCode As log4net.Core.ErrorCode) Implements log4net.Core.IErrorHandler.Error 
        Throw New Exception(message, e) 
    End Sub 
End Class 

設定ファイルの FileAppender のセクションに ErrorHandler 属性に作ったクラスを設定する

※ Log4Net_Test はプロジェクトの名称

これで、Log4Net_ErrorHandler クラスの Error メソッドが異常時にコールされます。
ただ、Log4Net_ErrorHandlerクラスの生成を LogManager(?)が行なっているので実際は対応が行ないにくいかもしれないので、別の方法も。

設定ファイルの ErrorHandler 属性は削除して。

Dim log As log4net.ILog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) 
Dim oAppender As log4net.Appender.FileAppender 
Dim oHandler As New Log4Net_ErrorHandler 


oAppender = log.Logger.Repository.GetAppenders(0) 
oAppender.ErrorHandler = oHandler 

って書けば、任意のAppender に対してエラーハンドリングできるし、Log4Net_ErrorHandler も見える位置に居るので対応がやりやすいのかも。
※log.Logger.Repository.GetAppenders(0) の箇所は当然、利用している Appender が増えれば (0) 固定では出来ないので .Length でループで FileAppender を探してね。





Appender 毎の出力レベルの設定の方法はマニュアルに書いてあるレベルの設定で出来た。まあ、当然かな。笑