2011-06-22 15 views
4

私はlog4netに奇妙な問題があります。外部設定ファイルからlog4netが設定されていません

ASP.NETアプリケーションでは、外部からlog4netを設定したいので、Webアプリケーションに属するAssemblyInfo.csファイルに、この行のWebアプリケーションに接続する別のlog4net.configファイルがあります。

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

私はlog4netのロガークラスをインスタンス化した場合さて、このような通常の方法:

public class MyClass 
{ 
    private static readonly ILog _logger = log4net.LogManager.GetLogger(typeof(MyClass)); 
    .... 

はその後、この作品、およびロギングは通常通り動作します。しかし、別のアセンブリ(インフラストラクチャ)の一部であるLogManagerクラスにログコードをラップし、多数のプロジェクトで再利用しています。

public static class LogManager 
{ 
    public static ILog GetLogger() 
    { 
     var stack = new StackTrace(); 
     var frame = stack.GetFrame(1); 
     return new log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType); 
    } 
} 

だから私は私のasp.netのコードでこれを使用することができます:それはこのようになりますのgetLoggerあり

public class MyClass 
{ 
    private static readonly ILog _logger = LogManager.GetLogger(); 
    .... 

をしかし...これは動作しません!ロギングは生成されません。設定ファイルを正しくフックアップするようには見えません。 log4netの設定をweb.configに直接入れると、このLogManagerは正常に動作します。

+1

Log4Netは、現在実行中のアセンブリで最初にプロードされたときにアセンブリ属性をスキャンしているため、そのアトリビュートがそのアセンブリで定義されていない場合、期待どおりにセットアップされませんか? –

+0

これはEbenのレスポンスに関連している可能性があります。 –

答えて

3

ビブー(Bibhu)が何を言っているかをまとめます。それはすべてlog4net.Config.XmlConfiguratorと関係があります。

にはがあり、ログを開始する前にlog4netを設定します。したがって、LogManagerクラスを使用するたびに、ホスティングアプリケーション(windows、web)ログを設定する必要があります。

いずれか、またはあなたのLogManagerで行う必要があります。

+0

したがって、LogManagerクラスを使用し、そのクラスが別のアセンブリにある場合は、global.asax.cs内のXmlConfigurator.Configure()を手動で呼び出す必要があります。それは修正されますが、私はそれを取得しません - なぜ私は私の_loggerを*通常の方法で設定すればうまくいくのでしょうか? –

+0

ああ! chibacityのコメントごとに私はそれを見逃している可能性があります--- [assembly:log4net.Config.XmlConfigurator ...]ビットはどこに定義されていますか?ポイントは、ホスティングアプリケーション*にlog4netを設定することです(しかし、それは起こります) –

+0

これは問題のようです! LogManagerをアセンブリ属性を持たない別のアセンブリに移動したため、動作しません。今はすべて意味があります。 –

2

外部設定ファイルを使用してlog4netを設定するようにアプリケーションに指示します。これには本当に2つのスポットがあります。まず、global.asaxと2番目のassemblyInfo.csファイル。ほとんどの場合、すべてのコードがインラインになっているglobal.asaxファイルを使い始めることに注意してください。どんな理由であれ、これを動作させる唯一の方法は、global.asaxを分解してコードビハインドを使用し、assemblyInfo.csファイルを取り除くことでした。だからこのように見える。

global.asax: 

<%@ Application Language="C#" Inherits="GlobalAsax" %> 

global.asax.cs (in your App_Code folder): 

using System; 
using System.Web; 

public class GlobalAsax : HttpApplication 
{ 
    // you may have lots of other code here 
    void Application_Start(object sender, EventArgs e) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 
} 

log4netのは、どこの設定ファイルを検索する場所を知っているように、今、あなたはlog4netのの設定を呼び出して、アプリケーションを持っていることを、あなたはあなたのアセンブリ情報に属性を設定することができます。

AssemblyInfo.cs (in your App_Code folder): 

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

watchフラグはlog4netに、潜在的な変更の可能性について構成ファイルを監視するように指示します。これは、テストの途中でのみ、すべてのログをエラーに記録するように構成を変更する場合に役立ちます。

次に、ログを開始します。

+0

Udpの設定を使用する理由はわかりませんが、あなたの主なポイントは.Configure()メソッドが呼び出されていると思います。 assebly属性がこれを行う必要性を排除する印象? –

+0

@Matt Roberts - この質問を見ると、あなたを助けるかもしれません。 http:// stackoverflow。com/questions/1731513/best-practice-to-include-log4net-external-config-file-in-asp-net – Bibhu

+0

ありがとう、それはベストプラクティスです。私がしていることは私のために働いていて、私はそれに満足していましたが、コードをLogManagerに移動すると、それはボークになりました:) –

関連する問題