我想为我的MVC3应用程序设置一个基本控制器。我的其他控制器将继承的东西。我想要做的是实现日志记录。我看到以下示例:
public class baseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
this.View("Error").ExecuteResult(this.ControllerContext);
}
}
但我不确定要记录什么以及如何记录它。有人可以给我一些关于基本控制器中的错误处理的建议。我希望有人能帮帮忙。谢谢。
答案 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之类的东西来处理细节。