1

次の要件があります。

簡単にするために、私のソリューションが 2 つのプロジェクトで構成されているとしましょう。

  1. Log4Net 機能をラップするクラス ライブラリ プロジェクト。
  2. log4net の実際のメソッドを呼び出す必要があるクラス ライブラリ ロガー メソッドへのアプリの呼び出しとしての MVC Web アプリケーション プロジェクト。

このプロジェクトでは、クラス ライブラリの app.config ファイルまたは xml ファイルで log4net config を指定したいと考えていました。

このスレッドで simlar issue を読みました。スタンドアロン クラス ライブラリ アセンブリに対して log4net を構成して有効にするにはどうすればよいですか?

しかし、私のclasslibrayプロジェクトのAssembly.infoファイルに次の2行を入れるという解決策はうまくいきませんでした。

[assembly: log4net.Config.Repository("ClassLibrary1")]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "ClassLibrary1.config", Watch = true)]

Log4Net は関連する構成を見つけることができないためです。

レコードの場合、クラス ライブラリ アセンブリの名前 = ClassLibrary1

このライブラリは、mvc Web アプリ プロジェクトから参照しています。

スレッドのようにsolution2を使用する理由はありますか?スタンドアロンのクラスライブラリアセンブリに対してlog4netを構成して有効にするにはどうすればよいですか?

私のために働いていませんか?

編集:

私のプログラムの流れはこんな感じです。

MVC アプリが起動します。

Unity は、コンストラクター インジェクションを介して log4netwrapper のシングルトン インスタンスを正常にインジェクトします。

次に、アクション メソッドで、ラッパーを介してロガーを呼び出します。ラッパー コンストラクターで、XmlConfigurator を作成します。

呼び出し中は、構成エントリを読み取るためのパスとして fileinfo オブジェクトを提供していないことに注意してください。その目的のために、私のラッパーアセンブリでのみ

[assembly: log4net.Config.Repository("ClassLibrary1")] 
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "ClassLibrary1.config", 
                                          Watch = true)]. 

ここに解決策はありますか?

4

1 に答える 1

1

アセンブリ属性のlog4netドキュメントを見ると、次のように書かれています:

したがって、構成属性を使用する場合は、log4net を呼び出して属性を読み取れるようにする必要があります。LogManager.GetLogger を単純に呼び出すと、呼び出し元のアセンブリの属性が読み取られて処理されます。したがって、アプリケーションの起動中はできるだけ早く、確実に外部アセンブリが読み込まれて呼び出される前に、ロギング呼び出しを行うことが不可欠です。

問題は、MVC プロジェクトのスタートアップでこれを行うと、アセンブリ属性外部アセンブリ ClassLibrary1 にあるということです。

XmlConfigurator.Configure(...)リンク先の回答のように使用すると、機能します。

于 2013-11-10T20:58:00.513 に答える