2011-12-30 25 views
3

私はtutorial to setup log4netにWindsorコンテナを使用しました。チュートリアルと同様に、IセットアップLoggerInstallerクラス:Global.asaxの中log4net、Castle Windsor、Global.asaxのApplication_Errorメソッド

public class LoggerInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.AddFacility<LoggingFacility>(
      f => f.LogUsing(LoggerImplementation.Log4net) 
        .WithConfig("log4net.config")); 
    } 
} 

、私は次の方法があります:

private static void BootStrapContainer() 
{ 
    container = new WindsorContainer() 
     .Install(FromAssembly.This()); 
    var controllerFactory = new WindsorControllerFactory(container.Kernel); 
    ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
} 

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 

    BootStrapContainer(); 
} 

そしてILoggerですタイプが注入される。

public ILogger Logger { get; set; } 

これはILoggerプロパティを持つコントローラで正常に動作しますが、Global.asaxに注入するようには見えません。 LoggerInstallerはのApplication_Start中に呼び出されている()が、注入されていない

void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 

    Logger.Error("App_Error", ex); 
} 

を:私は何をしたい、そのようのApplication_Errorメソッドで例外を未処理のログです。どんな助けもありがとう。おそらくそれは私が見落としているシンプルなものだと確信しています。

答えて

1

"Logger"はWindsor/IoC Containerで作成されていない(できない)ため、 "global.asax"に挿入されません。

あなたは「のApplication_Error」内ロガーが必要な場合は、私は、「のApplication_Start」の中に、あなたのコンテナを作成することを提案する「のGlobal.asax」クラスにプライベートそれを維持し、「のApplication_Error」方法

void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 

    var logger = _container.Resolve<ILogger>(); 
    logger.Error("App_Error", ex);  
    _container.Release(logger); 
} 
以内に解決/リリースアプローチを使用する場合があります
+0

これは良いアプローチのようですが、値に 'var logger = _container.Resolve ();を割り当てると、ロガーインスタンスが正しく設定されていないように見えて、log4net.configの設定に従ってログに記録されません。私はApplication_Start()中にコンテナを作成しています...どんな考えですか? – dolphy

+0

スニペットコードを正常に実行できますか? ILoggerは正常に解決されましたか?アプリケーションルートレベルでlog4net.configを持っていますか? log4net.configの設定を確認しましたか? – Crixo

+0

あなたのコードはコンパイルされて正常に動作しますが、ILogger(log4netのネイティブタイプではなく、城の名前空間からのものです)が正しく設定されていないようです。 log4net.configはルートディレクトリにあり、コントローラメソッドで使用するとうまく動作します。問題を二乗する時間を割いていない。 – dolphy

関連する問題