【问题标题】:log4net, Castle Windsor, and the Application_Error method in Global.asaxlog4net、Castle Windsor 和 Global.asax 中的 Application_Error 方法
【发布时间】:2012-01-30 15:20:55
【问题描述】:

我使用 Windsor 容器跟踪了tutorial to setup log4net。和教程一样,我设置了 LoggerInstaller 类:

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

在Global.asax中,我有以下方法:

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。我想要做的是在 Application_Error 方法中记录未处理的异常,如下所示:

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

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

在 Application_Start() 期间正在调用 LoggerInstaller,但没有注入。任何帮助,将不胜感激。我确定这可能是我忽略的一些简单的事情。

【问题讨论】:

    标签: c# asp.net-mvc log4net castle-windsor


    【解决方案1】:

    “Logger”不会被注入“global.asax”,因为该类尚未通过 Windsor/IoC Container 创建(无法完成)。

    如果您在“Application_Error”中需要记录器,我可能会建议您在“Application_Start”中创建容器,将其保留在“global.asax”类中,并在“Application_Error”方法中使用 Resolve/Release 方法

    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);
    } 
    

    【讨论】:

    • 这似乎是一个好方法,但是在分配值时:var logger = _container.Resolve&lt;ILogger&gt;(); 记录器实例似乎没有正确配置,并且没有按照我的 log4net.config 设置进行记录。我在 Application_Start() 期间创建容器...有什么想法吗?
    • 你能成功运行我的 sn-p 代码吗? ILogger 是否解析成功?您在应用程序根级别有 log4net.config 吗?您是否验证了 log4net.config 设置?
    • 您的代码编译并运行良好,但 ILogger(来自城堡命名空间,而不是 log4net 本机类型)似乎配置不正确。 log4net.config 位于根目录中,在控制器方法中使用时可以正常工作。没有太多时间来解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2018-02-14
    相关资源
    最近更新 更多