基本的に、インターフェースを作成してから、Log4net のクラスとメソッドを直接ラップするそのインターフェースの具体的な実装を作成します。追加のロギング システムは、それらのシステムの他のクラスとメソッドをラップするより具体的なクラスを作成することでラップできます。最後に、ファクトリを使用して、構成設定またはコード行の変更に基づいてラッパーのインスタンスを作成します。(注: StructureMapなどのInversion of Controlコンテナーを使用すると、より柔軟かつ複雑にすることができます。)
public interface ILogger
{
void Debug(object message);
bool IsDebugEnabled { get; }
// continue for all methods like Error, Fatal ...
}
public class Log4NetWrapper : ILogger
{
private readonly log4net.ILog _logger;
public Log4NetWrapper(Type type)
{
_logger = log4net.LogManager.GetLogger(type);
}
public void Debug(object message)
{
_logger.Debug(message);
}
public bool IsDebugEnabled
{
get { return _logger.IsDebugEnabled; }
}
// complete ILogger interface implementation
}
public static class LogManager
{
public static ILogger GetLogger(Type type)
{
// if configuration file says log4net...
return new Log4NetWrapper(type);
// if it says Joe's Logger...
// return new JoesLoggerWrapper(type);
}
}
クラスでこのコードを使用する例 (静的読み取り専用フィールドとして宣言):
private static readonly ILogger _logger =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
以下を使用して、同じようにわずかにパフォーマンスに適した効果を得ることができます。
private static readonly ILogger _logger =
LogManager.GetLogger(typeof(YourTypeName));
前者の例は、より保守しやすいと考えられています。
Log4Net は呼び出しタイプのログを記録するため、すべてのロギングを処理するシングルトンを作成することは望ましくありません。すべてのメッセージを報告するログ ファイル内の単一のタイプを確認するだけでなく、各タイプで独自のロガーを使用する方が、はるかにクリーンで便利です。
実装はかなり再利用可能 (組織内の他のプロジェクト) である必要があるため、それを独自のアセンブリにするか、理想的には自分の個人/組織のフレームワーク/ユーティリティ アセンブリに含めることができます。各ビジネス/データ/UI アセンブリで個別にクラスを再宣言しないでください。これは維持できません。