【问题标题】:What does an MVC baseController with logging look like?带有日志记录的 MVC baseController 是什么样的?
【发布时间】:2014-08-19 14:57:36
【问题描述】:

我想为我的 MVC3 应用程序设置一个基本控制器。我的其他控制器会继承的东西。我想要做的是实现日志记录。我看到了以下示例:

public class baseController : Controller
{

     protected override void OnException(ExceptionContext filterContext)
     {
         filterContext.ExceptionHandled = true;
         this.View("Error").ExecuteResult(this.ControllerContext);
     }

}

但我不确定要记录什么以及如何记录它。有人可以就基本控制器中的错误处理方式给我一些建议吗?我希望有人能帮帮忙。谢谢你。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    您似乎正在寻找某种基本级别的应用程序错误处理。为什么不在 Global.asax 文件中添加 Application_Error 方法的定义。这将捕获应用程序中出现的任何未处理的异常(来自控制器、其他库或视图等)

    示例如下:将其添加到您的 Global.asax:

    protected void Application_Error(object sender, EventArgs e)
    {
         Exception exception = Server.GetLastError();
         Response.Clear();
    
         //Do your logging here.
         //Redirect to an appropriate error page.
    }
    

    如果您想知道要记录什么,您可以在此方法中访问异常对象中的大量信息。我通常编写一个类,将其中的一些信息写入文本文件。这是一个示例(在名为 Log 的类中) - 它不是最全面的方法,我确信可以从异常对象中提取更多信息,但是:

    public class Log 
    {
        private StreamWriter _writer;
    
        public void WriteErrorMessage(string errorMessage, string pageUrl, Exception e)
        {
            _writer = new StreamWriter("LOG_FILE_OUTPUT_PATH_HERE.txt", true);
            StringBuilder fullError = new StringBuilder();
    
            fullError.AppendLine("Error log: " + DateTime.Now);
            fullError.AppendLine(errorMessage);
            fullError.AppendLine("Error raised on: " + pageUrl);
            fullError.AppendLine("Associated exception message: " + e.Message + "\n" + e.InnerException);
            fullError.AppendLine("Exception class: " + e.GetType().ToString());
            fullError.AppendLine("Exception source: " + e.Source.ToString());
            fullError.AppendLine("Exception method: " + e.TargetSite.Name.ToString());
            fullError.AppendLine();
            _writer.WriteLine(fullError);
            _writer.Flush();
            _writer.Close();
        }
    }
    

    然后,在您的 Application_Error 方法(我们在上面定义的)中调用:

    new Log().WriteErrorMessage("Global error has occurred.", Request.Url.ToString(), exception);
    

    【讨论】:

      【解决方案2】:

      如果您想记录未处理的异常,最好在应用程序级别进行处理。 ELMAH 是一个很好的起点,或者只是使用内置的心跳处理。

      就日志记录而言,最好的办法是使用 log4net 之类的东西来处理细节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2021-03-19
        相关资源
        最近更新 更多