【问题标题】:Where to catch exception using log4net in a MVC 3 application?在 MVC 3 应用程序中使用 log4net 在哪里捕获异常?
【发布时间】:2013-02-26 20:28:35
【问题描述】:

我将以下代码放在全局文件中以在我的 mvc 应用程序中捕获异常:

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

以及以下内容以跟踪调用的控制器:

public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (log.IsDebugEnabled)
            {
                var loggingWatch = Stopwatch.StartNew();
                filterContext.HttpContext.Items.Add(StopwatchKey, loggingWatch);

                var message = new StringBuilder();
                message.Append(string.Format("Executing controller: {0}, action: {1}",
                    filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
                    filterContext.ActionDescriptor.ActionName));

                log.Debug(message);
            }
        }

我还能做些什么来捕获涉及 db、安全性(例如无法连接到 ldap)、数据问题/转换等的错误吗?

【问题讨论】:

  • 只是想知道如何在 DAL 和辅助类中处理日志记录?

标签: asp.net-mvc-3 logging exception-handling log4net


【解决方案1】:

第二个代码 sn-p 可以添加到全局操作过滤器(注册在global.asax)。第一个 sn-p 可以添加到单独的 IHttpModule 实现中,以将其从 global.asax 中删除。

除此之外,您还向将捕获所有异常的两个地方添加了代码。第一个将针对所有非 MVC 相关异常调用,而后一个仅针对 MVC 异常(不包括路由)

【讨论】:

  • 只是想知道如何在 DAL 和辅助类中处理日志记录?
  • 你不会(除非你处理它们:blog.gauffin.org/2010/11/do-not-catch-that-exception)。这些错误将被错误过滤器捕获。
  • 好的,这对异常来说是有意义的......对每种方法进行跟踪是否是一种好习惯,例如:log.Info('Executing GetAgency(id)')?
  • 仅当您的方法不可靠时。恕我直言,最好始终验证合理数据的方法参数(如果某些内容未验证,则抛出其中一个参数异常)。这样,您可能会在调用堆栈中获得更高的异常。这让调试变得更容易了。
猜你喜欢
  • 2015-09-25
  • 2011-01-16
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2011-10-13
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多