ASP.NET MVC应用程序中的异常日志记录

时间:2016-12-27 12:59:50

标签: asp.net-mvc exception-handling error-logging

目前我按如下方式记录例外情况 -

 public ActionResult Login()
 {
        try
        {
            throw new Exception("test");
        }
        catch (Exception ex)
        {
            LogException(ex);
        }  
        return View();
    }

我可以清楚地看到&有关此LogException()方法的异常的详细信息。见下文 -

Created on: 27-Dec-2016, 06.34.33 PM
Type: System.Exception
Error Description: test 
Source File: ...\Controllers\LoginController.cs
Method: Login
Line: 20
Column: 17

我在 -

中尝试了相同的方法
public class MyCustomAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Exception ex = filterContext.Exception;            
        LogException(ex)
    }
}

public class MyCustomAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
         Exception ex = filterContext.Exception;            
         LogException(ex)
    }
}

我也试过重载OnException方法 -

public abstract class BaseController : Controller
{
        public BaseController() {}

        protected override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;

            LogException(ex);
        }
}

在所有三个重大案例中,我都没有得到有关源文件,方法,行和列的信息

 Created on: 27-Dec-2016, 06.44.45 PM
 Type: System.Exception
 Error Description: test 
 Source File: 
 Method: <BeginInvokeAction>b__1e
 Line: 0
 Column: 0

这是我记录异常的方法 -

       public static void Create(Exception exception, String rootDirectoryPath)
        {
            try
            {
                StackTrace st = new StackTrace(exception, true);                 
                StackFrame frame = st.GetFrame(st.FrameCount - 1);
                string fileName = frame.GetFileName();
                string methodName = frame.GetMethod().Name;
                int line = frame.GetFileLineNumber();
                int col = frame.GetFileColumnNumber();

                //Other code .....
            }
            catch (Exception)
            {
                //do nothing.               
            }
        }

我的问题是,是否可以从这三种情况中检索源文件,方法,行和列信息?

我不想每次都写try .. catch..来处理异常。

我听说过ELMAH&amp; log4net的。但不确定这些图书馆是否能够从例外中提供我想要的信息。

很抱歉这个问题很长。

2 个答案:

答案 0 :(得分:1)

我是Coderr的作者,负责跟踪您的例外情况。

您的解决方案的问题是异常过滤器(以及ASP.NET框架调用来调用它)将成为堆栈跟踪的一部分,因此从堆栈跟踪对象获取帧将不起作用。

另请注意,如果您将网站投入生产时未包含.PDB文件,则无法获得文件编号。

最常见的方法是记录exception.ToString(),其中包含堆栈跟踪中的行号(如果有PDB文件)。

为什么要使用自定义方法?

答案 1 :(得分:0)

你正在重新发明轮子,因为ELMAH可以很好地完成工作。你试试看了吗?只需一个Nuget包和一些完全设置的配置。

您可以从Scot Hanselmanread the tutorial了解更多相关信息。