筆記如何透過 NLog 並且在 ASP.NET MVC 使用 Exception Filter 的方式達成發生例外情形時,儲存為日誌資訊,讓系統維護人員能夠主動出擊處理問題。

說明
需要日誌紀錄的原因:
一、依照系統設計的安全性需求,紀錄管理者行為、身分驗證行為、存取資源行為與重要資料異動等留下稽核紀錄。
二、將例外情形發生時,儲存相關資訊為日誌紀錄,讓系統維護人員在處理問題時能夠得到更詳盡甚至是還原使用者所碰到的問題。
Application_Error
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
string errorMessage = ex.ToString();
using (ErrorLogContext context = new ErrorLogContext())
{
ErrorLog log = new ErrorLog { ErrorMessage = errorMessage };
context.ErrorLogs.Add(log);
context.SaveChanges();
}
}
Application_Error in global.asax not catching errors in WebAPI
HandleErrorAttribute
HandleErrorAttribute 是 ASP.NET MVC 預設實作的例外處理機制,會透過 FilterConfig.cs
註冊的全域中,讓所有發生的 ASP.NET Http Status Code 500 Error (對 🙂 只有 500,404 等其他 Http Status Code 並不會) 都會經由 HandleErrorAttribute
處理。而 HandleErrorAttribute
的處理就是以 /Views/Shared/Error.cshtml 作為回應結果。
IExceptionFilter
ASP.NET MVC實現IExceptionFilter接口編寫自定義異常處理過濾器
Global Exception Filter
Combined With Custom Error
NLog
public class NLogExceptionFilter : ExceptionFilterAttribute
{
private readonly ILogger _logger = LogManager.GetCurrentClassLogger();
public override void OnException(ExceptionContext filterContext)
{
// filterContext.Result
// filterContext.Exception
_logger.Error(filterContext.Exception, "Error Occurred");
}
}
[NLogExceptionFilter]
public class HomeController : Controller
{
// ...
}