Castle Windsor を使用して Log4Net ILog をクラスに注入する方法を調査しています。ほとんどの例で、Castle Windsor がプロパティ インジェクションを提供し、ILogger (ILog ではなく) をインジェクトする「ファシリテーター」を提供できる場所がわかります。コンストラクター注入が使用され、ファシリテーター メソッドが使用されていない例を 1 つだけ見つけました ( Castle Windsor 依存性注入: Use the caller type as a parameter を参照) 。
これらすべての例で、Log4Net は名前付きロガーを必要としているようです。ほとんどの例は、Log4Net 静的メソッド LogManager.GetLogger (ここではクラス名) を参照しています。これにより、リフレクションまたはファシリテーター メソッドを使用せずに CastleWindsor の依存関係を定義することが困難になります (ファシリテーター メソッドは ctor インジェクションで使用できますか??)。Ilya Kogan (上記の URL...) による質問を見ると、なぜ名前付きロガーが必要なのか、あるいは必要なのかさえ理解できないと思います。どこでも同じ名前のロガーを使用できませんか?
たとえば、XXX というハードコードされた名前でロガーを登録することはできませんか? (問題なく動作しているようで、最終的にはログを記録したいだけです。どのロガーがログを記録したかは気にしません...) スコープの問題はありますか? メモリリークの問題はありますか? ロガーをシングルトンにできない/すべきでないのはなぜですか?
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<log4net.ILog>().UsingFactoryMethod(() => log4net.LogManager.GetLogger("xxx"))
);
}
アップデート:
いくつかの調査では、上記の例の XXX など、ハードコーディングされた名前付きロガーを使用できますが、ロガーの構成がロガー名をログファイルに出力し、ロガー名がメソッドと同じ名前に動的に割り当てられている場合、またはクラスを使用すると、ロギングの発生元への参照が自動的に取得されます。ログ ファイル内のコンテキストは非常に役立ちます。
特にctorインジェクションに対処する場合、5つの可能なオプションがあるようです...
- シングルトンを使用し、名前付きロガーを使用しない (したがって、ログ ファイルには報告されません)
- ctor インジェクションでリフレクションを使用する (Ilya Kogan の例に見られるように)
- プロパティ注入を使用する (ファシリテーター経由)
- ロギングにポストシャープ AOP IL インジェクションを使用する
- CTOR インジェクションを使用する (ファシリテーター経由)