Logging errors in ASP.NET MVC

前端 未结 6 1338
温柔的废话
温柔的废话 2020-12-07 06:55

I\'m currently using log4net in my ASP.NET MVC application to log exceptions. The way I\'m doing this is by having all my controllers inherit from a BaseController class.

相关标签:
6条回答
  • 2020-12-07 07:25

    You can hook into the OnError event in the Global.asax.

    Something like this:

    /// <summary>
    /// Handles the Error event of the Application control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    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);
            }
    
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-07 07:28

    MVC3
    Create Attribute that inherits from HandleErrorInfoAttribute and includes your choice of logging

    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();
            }
        }
    

    Place attribute in Global.asax RegisterGlobalFilters

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
           // filters.Add(new HandleErrorAttribute());
            filters.Add(new ErrorLoggerAttribute());
        }
    
    0 讨论(0)
  • 2020-12-07 07:29

    I would consider simplifying your web application by plugging in Elmah.

    You add the Elmah assembly to your project and then configure your web.config. It will then log exceptions created at controller or page level. It can be configured to log to various different places (like SQL Server, Email etc). It also provides a web frontend, so that you can browse through the log of exceptions.

    Its the first thing I add to any asp.net mvc app I create.

    I still use log4net, but I tend to use it for logging debug/info, and leave all exceptions to Elmah.

    You can also find more information in the question How do you log errors (Exceptions) in your ASP.NET apps?.

    0 讨论(0)
  • 2020-12-07 07:29

    Have you thought about extending the HandleError attribute? Also, Scott has a good blog post about filter interceptors on controllers/ actions here.

    0 讨论(0)
  • 2020-12-07 07:42

    The Error.aspx view is defined like this:

    namespace MvcApplication1.Views.Shared
    {
        public partial class Error : ViewPage<HandleErrorInfo>
        {
        }
    }
    

    The HandleErrorInfo has three properties: string ActionName string ControllerName Exception Exception

    You should be able to access HandleErrorInfo and therefore the Exception within the view.

    0 讨论(0)
  • 2020-12-07 07:51

    You can try to examine HttpContext.Error, but I am not sure on this.

    0 讨论(0)
提交回复
热议问题