【问题标题】:log4net log all unhandled application errorslog4net 记录所有未处理的应用程序错误
【发布时间】:2010-11-24 23:24:00
【问题描述】:

您能否指出一些教程或示例,说明如何使用 log4net 记录我的 mvc Web 应用程序上发生的所有未处理的异常。谢谢

【问题讨论】:

  • 你可能会也可能不会觉得这很有趣(我不确定它是否适用于 log4net):ELMAH - code.google.com/p/elmah
  • 谢谢!实际上,在解决这个问题时,我还把我的应用程序连接到了 Elmah,我真的很喜欢它方便的界面。与 log4 net 相比,我现在看到我自己更多地使用它,但我会看到更多的经验会如何发展..

标签: c# asp.net asp.net-mvc logging log4net


【解决方案1】:

我粘贴在我在 global.asax 上使用的代码下方,这似乎让我暂时满意。我在 log4net 生成的日志文件中收到所有未处理的异常。

    public class MvcApplication : System.Web.HttpApplication
    {

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

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

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


        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
            log4net.Config.XmlConfigurator.Configure();

        }

    }

【讨论】:

  • 您也可以使用 HttpModule 来注册错误事件处理程序:codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx
  • 如果您的站点中没有网站图标,您需要将 routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 添加到 RegisterRoutes 方法中
  • 关于HttpModule:链接文章中详细介绍的注册模块的方法适用于旧的Classic IIS管道模式,而不是(现在推荐的)集成模式。如果您使用集成模式,请参阅msdn.microsoft.com/library/ms227673(v=vs.100).aspx了解如何注册它的详细信息。
  • 那么在这种情况下异常会记录到哪里?
【解决方案2】:

对于 ASP.NET 应用程序,您喜欢使用位于 Global.asax 文件中的 System.Web.HttpApplication.Error 事件。

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

    // Stop error from displaying on the client browser
    Context.ClearError();

    logger.Fatal(ex.ToString);

}

观看Managing unhandled exceptions

【讨论】:

    【解决方案3】:

    您可能有兴趣查看Aspect Oriented Programming (AOP) 是什么。

    我们使用Post sharp 完成了这项工作(仅 - 我们没有使用 log4net,而是使用自定义跟踪器)。

    首先检查一下 log4net 是否没有这种“开箱即用”的东西。我不确定。

    【讨论】:

      【解决方案4】:

      log4net 中没有对此的内置支持。您应该在 Global.asax 中实现the Application_Error event 并在那里调用您的 log4net 记录器。您的应用中所有未处理的事件都会触发该事件。

      【讨论】:

        【解决方案5】:

        不要开玩笑here you go

                try
                {
                    NotImplementedException nie = new NotImplementedException();
                    throw nie;
                }
                catch (Exception e)
                {
                    Log.Fatal(e);
                }
        

        假设您使用的是 .net 3.5,您可以使用扩展方法,扩展 System.Exception 并添加一个 Log(log4net.ILog log) 方法,然后在您的应用程序中捕获异常的任何位置,假设您已设置正确记录实例,然后您就可以轻松完成。您的扩展类可能会增长很多,包括 Debug、Info、Warn、Error 和 Fatal 等的各种重载。

        【讨论】:

        • 抱歉我的问题不清楚 - 我需要记录所有未处理的异常
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多