0

私のプロジェクトでは、log4net を内部的に使用する DLL 参照があります。私のMainクラスでは、次の 2 つのステートメントを挿入しました。

using log4net;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

App.Confファイルも用意しました。

上記だけでは、ロギングが開始されません。しかし、さらにステートメントを追加すると

private static readonly ILog log = LogManager.GetLogger(typeof(Main));

私のMainクラスでは、ロギングが開始され、すべて正常に動作します。

ILogロギングの開始をトリガーするオブジェクトを作成する必要があるのはなぜですか? ファイルのアセンブリ ステートメントでApp.Conf十分ではないでしょうか。

4

2 に答える 2

1

初めてLogManager.GetLogger実行すると、log4net がどのように構成されているかを判断しようとします。これは、現在のアセンブリで log4net 属性を探すことによって行われます。

アセンブリでロガーを作成しない場合、最初にロガーが作成されるのは参照された dll からであるため、log4net はその dll で log4net 属性を探しますが、見つからないため、構成が無視されます。

行を含めることで

private static readonly ILog log = LogManager.GetLogger(typeof(Main));

メインアプリケーションでは、このメソッドはexeから実行され、log4netはexeで属性を探し、今回は属性を見つけてから、正しい構成をロードします.

私が理解しているように、この構成は GetLogger が最初に呼び出されたときにのみ行われるため、最初にメイン アプリケーションから GetLogger が呼び出されるようにすることが重要です。

于 2013-09-13T09:29:55.317 に答える
0

私はほとんどいつも使用しています:

private static readonly NLog.Logger log = LogManager.GetCurrentClassLogger();

これにより、 (typeof(Main)) を実行する必要がなくなり、ログが必要なファイルにカット アンド ペーストするだけで済みます。

「ログ」オブジェクトを作成せずにログを呼び出そうとした方法について混乱しています。何をしようとしていたのですか?

おそらく、上で示したコード行を使用するだけです。

于 2013-09-13T01:32:27.697 に答える