当前位置:  开发笔记 > 后端 > 正文

ASP.NET MVC中的日志记录错误

如何解决《ASP.NETMVC中的日志记录错误》经验,为你挑选了3个好方法。

我目前正在ASP.NET MVC应用程序中使用log4net来记录异常.我这样做的方法是让我的所有控制器继承自BaseController类.在BaseController的OnActionExecuting事件中,我记录可能发生的任何异常:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    // Log any exceptions
    ILog log = LogManager.GetLogger(filterContext.Controller.GetType());

    if (filterContext.Exception != null)
    {
        log.Error("Unhandled exception: " + filterContext.Exception.Message +
            ". Stack trace: " + filterContext.Exception.StackTrace, 
            filterContext.Exception);
    }
}

如果在控制器操作期间发生未处理的异常,则此方法很有用.

至于404错误,我在web.config中设置了自定义错误,如下所示:


    

在处理"页面未找到"网址的控制器操作中,我记录了所请求的原始网址:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
    log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));

    return View();
}

这也有效.

我遇到的问题是如何记录.aspx页面本身的错误.假设我在其中一个页面或某些内联代码上出现编译错误,这将导致异常:

<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>

似乎HandleError属性正确地将其重新路由到Shared文件夹中的Error.aspx页面,但它肯定没有被我的BaseController的OnActionExecuted方法捕获.我想我可以将日志代码放在Error.aspx页面本身,但我不确定如何在该级别检索错误信息.



1> Andrew Rimme..:

我会考虑通过插入Elmah来简化您的Web应用程序.

您将Elmah程序集添加到项目中,然后配置web.config.然后,它将记录在控制器或页面级别创建的异常.它可以配置为记录到各种不同的位置(如SQL Server,电子邮件等).它还提供了Web前端,以便您可以浏览异常日志.

它是我添加到我创建的任何asp.net mvc应用程序的第一件事.

我仍然使用log4net,但我倾向于使用它来记录调试/信息,并将所有例外留给Elmah.

您还可以在问题中找到更多信息如何在ASP.NET应用程序中记录错误(例外)?.


为什么我需要ELMAH和log4net for app.日志记录?为什么不是一个解决方案?
我最近开始使用Elmah,它是我用过的最简单,最简单的异常记录器之一.我读了一篇帖子说MS应该把它包含在ASP.net中我同意.
ELMAH被高估了.

2> Chuck Conway..:

您可以挂钩Global.asax中的OnError事件.

像这样的东西:

/// 
/// Handles the Error event of the Application control.
/// 
/// The source of the event.
/// The  instance containing the event data.
protected void Application_Error(object sender, EventArgs e)
{
    if (Server != null)
    {
        Exception ex = Server.GetLastError();

        if (Response.StatusCode != 404 )
        {
            Logging.Error("Caught in Global.asax", ex);
        }

    }


}


忽略404对你的编写方式不起作用.我写了`if(ex是HttpException &&((HttpException)ex).GetHttpCode()== 404)return;`
根据ReSharper的价值分析,`Server`将始终为非null.
这应该捕获所有例外情况.我认为这是最好的做法.

3> 小智..:

MVC3
创建继承自HandleErrorInfoAttribute的属性,包括您选择的日志记录

public class ErrorLoggerAttribute : HandleErrorAttribute 
{
    public override void OnException(ExceptionContext filterContext)
    {
        LogError(filterContext);
        base.OnException(filterContext);
    }

    public void LogError(ExceptionContext filterContext)
    {
       // You could use any logging approach here

        StringBuilder builder = new StringBuilder();
        builder
            .AppendLine("----------")
            .AppendLine(DateTime.Now.ToString())
            .AppendFormat("Source:\t{0}", filterContext.Exception.Source)
            .AppendLine()
            .AppendFormat("Target:\t{0}", filterContext.Exception.TargetSite)
            .AppendLine()
            .AppendFormat("Type:\t{0}", filterContext.Exception.GetType().Name)
            .AppendLine()
            .AppendFormat("Message:\t{0}", filterContext.Exception.Message)
            .AppendLine()
            .AppendFormat("Stack:\t{0}", filterContext.Exception.StackTrace)
            .AppendLine();

        string filePath = filterContext.HttpContext.Server.MapPath("~/App_Data/Error.log");

        using(StreamWriter writer = File.AppendText(filePath))
        {
            writer.Write(builder.ToString());
            writer.Flush();
        }
    }

将属性放在Global.asax RegisterGlobalFilters中

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
       // filters.Add(new HandleErrorAttribute());
        filters.Add(new ErrorLoggerAttribute());
    }

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有