5

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 インジェクションを使用する (ファシリテーター経由)
4

2 に答える 2

6

良い質問です。

つまり、log4net は名前付きロガーを必要とします。名前はログ出力のフィルタリングに使用されるためです (詳細については、log4net のドキュメントを参照してください)。型名は単なる便利な慣例です。追加のコンテキストを提供し、名前空間の正しい使用と相まって、「すべての NHibernate メッセージを別のファイルに記録する」などのことを実行できるようにするためです。

そのため、コンテナを使用していない場合、クラスに単一の静的ロガー プロパティ/フィールドがあるのも一般的です。

ILoggerあなたが言及しているのは、キャッスルオーバーロギングの抽象化であり、そのうちの1つはlog4net用です。

LoggingFacility依存関係を提供するためのすぐに使えるサポートを提供しILoggerますが、これを強制するものではありません。

登録ILogは次のように書き換える必要があります (記憶から書いているため、詳細が若干異なる場合があります)。

Component.For<log4net.ILog>()
    .UsingFactoryMethod((k, c) => log4net.LogManager.GetLogger(c.RequestedType))
    .LifestyleTransient()

c.RequestedType依存関係を満たしているタイプを提供し、それを一時的にすると、すべてのタイプが依存関係を要求する最初のタイプにちなんで名付けられた logger の単一インスタンスを再利用するという問題が回避されます。

于 2012-11-14T22:41:20.160 に答える
4

Castle Windsorを使用してLog4NetログをDIするための推奨される方法は、Facilitiesを使用することです。1つはLog4Net用にすでに作成されており、その使用法はこのチュートリアルで示されています。

于 2012-11-14T22:31:34.877 に答える