3

私はmvc4アプリケーションでlog4netを使用しています(学術目的で)。メソッドのglobal.asaxでこのメソッドを呼び出していApplication_Start()ます。

log4net.Config.XmlConfigurator.Configure();

次に、私のアプリの任意のコントローラーで、このメソッドを呼び出すことができます。

 ILog _logger = LogManager.GetLogger(typeof(T));

Configure()問題は、メソッドでメソッドを呼び出しているが、そのApplication_Start()メソッドへの参照を変数に格納していない場合、メソッドはどのようにしGetLogger()てどこを探すか、より正確にはlog4netインスタンスをどこで見つけるかを知るためです。

個人的には、それへのパスを想像することはできません(ロードされたメモリの場所を知っている場合を除いて)。

4

1 に答える 1

3

Log4netは、それへの参照を静的変数に格納します。GetLoggerメソッドはその変数にアクセスでき、適切な値を返します。(実際、私はこれを少し単純化しすぎています。詳細については、log4netソースコードを参照してください。)

これは、シングルトンパターンのバリエーションです。

ちなみに、log4netで複数のロガーインスタンスを作成することができます(私が言うように、これはシングルトンのバリエーションです)。これを行うには、logger要素nameを介して追加のロガーを構成し、要素の属性を介して割り当てた名前をに渡しますLogManager.GetLogger()。このGetLoggerメソッドは、渡された名前を適切な静的ロガーインスタンスのルックアップキーとして使用し、最初に要求したときにそのインスタンスを作成します。

于 2013-03-11T15:12:05.543 に答える