ASP.NET MVC NLog With Exception Filter


  1. 說明
    1. Application_Error
    2. IExceptionFilter
    3. Combined With Custom Error
    4. NLog
  2. 參考連結

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

logo

說明

需要日誌紀錄的原因:

一、依照系統設計的安全性需求,紀錄管理者行為、身分驗證行為、存取資源行為與重要資料異動等留下稽核紀錄。

二、將例外情形發生時,儲存相關資訊為日誌紀錄,讓系統維護人員在處理問題時能夠得到更詳盡甚至是還原使用者所碰到的問題。


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
{
    // ...
}

參考連結

ASP.NET MVC 監測監控與LOG記錄

ASP.NET MVC全局異常處理和捕獲的思路