具有日志记录的MVC baseController是什么样的?

时间:2011-03-19 18:00:28

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

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

public class baseController : Controller
{

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

}

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

2 个答案:

答案 0 :(得分:2)

好像您正在寻找某种基本级别的应用程序错误处理。为什么不在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);

答案 1 :(得分:0)

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

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