【问题标题】:Catching all timeout exception and logging them to Elmah with more context捕获所有超时异常并将它们记录到具有更多上下文的 Elmah
【发布时间】:2015-10-13 08:13:22
【问题描述】:

我有多个使用 ASP.NET MVC 4/5 构建的 Web 应用程序。他们都使用 Elmah 进行错误处理,我们的应用程序也会出现很多超时错误。

这是它的记录方式:

等待操作超时

System.ComponentModel.Win32Exception

等待操作超时

我想记录一些更有意义的主题。像“DB Timeout - SP 名称”这样更有用的东西,否则我必须打开每个日志,读取堆栈跟踪,然后调试。

现在要实现这一点,我知道我可以编写一个自定义异常,捕获所有数据库超时异常并使用存储过程名称重新抛出我的自定义异常。

但这需要我在每个服务层代码中编写相同的 try catch。

还有其他更好的方法可以解决这个问题吗?

【问题讨论】:

    标签: c# asp.net-mvc elmah


    【解决方案1】:

    这可以通过 ELMAH 的错误过滤功能来实现。我已将其用于remove sensitive form data from elmah.io

    简而言之,您需要挂钩 ErrorLog_Filtering 事件(请参阅ELMAH's documentation):

    void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
    {
        var httpContext = args.Context as HttpContext;
        if (httpContext != null && args.Exception is TimeoutException)
        {
            var error = new Error(args.Exception, httpContext);
            error.Message = "DB Timeout - SP name";
            ErrorLog.GetDefault(httpContext).Log(error);
            args.Dismiss();
        }
    }
    

    每次 ELMAH 想要在错误日志中记录错误时都会调用此方法。如果存在 HTTP 上下文并且抛出的异常是 TimeoutException(仅以此为例,您需要将其替换为 DB 异常),我们会从抛出的异常中创建一个新错误。新错误会自动从抛出的错误中获取所有信息。通过 Log 方法记录新错误,并通过在事件 args 上调用 Dismiss() 以错误消息消除原始错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-11
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2010-09-10
      • 2011-03-01
      相关资源
      最近更新 更多