如何將我自己的日誌記錄邏輯附加到ASP.NET 5應用程序以處理業務邏輯和較低層中引發的每個異常?ASP.NET 5中的全局異常處理
我試着在Startup.cs中用自己的ILoggerProvider
實現和loggerfactory.AddProvider(new LoggerProvider(Configuration))
。但它似乎攔截了ASP.NET內部的東西,而不是我在低層拋出的異常。
如何將我自己的日誌記錄邏輯附加到ASP.NET 5應用程序以處理業務邏輯和較低層中引發的每個異常?ASP.NET 5中的全局異常處理
我試着在Startup.cs中用自己的ILoggerProvider
實現和loggerfactory.AddProvider(new LoggerProvider(Configuration))
。但它似乎攔截了ASP.NET內部的東西,而不是我在低層拋出的異常。
工作了,通過使用兩個選項:
1)ILoggerProvider 從命名空間Microsoft.Framework.Logging實現自己ILoggerProvider和ILogger然後將其連接到MVC框架中添加Startup.cs下面的代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
loggerfactory.AddProvider(new YourCustomProvider());
}
但是這上面的選項,似乎只能叫ILogger的寫入功能MVC的特定事件,路由相關的等等,當我披上下層例外它不叫,所以第二選項解決:
2)全局篩選 註冊自己的ActionFilterAttribute實施Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().Configure<MvcOptions>(options =>
{
options.Filters.Add(new YourCustomFilter());
});
}
這一點很重要,即自定義過濾器類實現了個IExceptionFilter interace:
public class YourCustomFilter : ActionFilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{
///logic...
}
}
(編輯:) 而然後在Startup類中添加過濾器:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new YourCustomFilter());
});
}
是否可以通過'OnException'方法更新響應內容?我可以更新狀態碼,但我想更新響應主體,但我不知道 – RPDeshaies 2015-07-15 12:28:13
是的,這可能是通過設置提供給OnException方法的ExceptionContext。例如context.Result = new RedirectResult ...或context.Result = new JsonResult .... – 2015-07-15 14:21:03
@alekkowalczyk嗨,我跟着你的例子,在第二步中爲我工作的語法有點不同。這裏是我的版本,也許可以幫助別人, services.AddMvc((options => { options.Filters.Add(new CustomFilerForExceptionHandling()); })); – Juan 2015-10-21 14:57:36
如果您需要一個真正的全局異常陷阱框架,而不僅僅是在控制器級別,請查看我的一個開源項目。我計劃在節假日後不久將它變成一個Nuget套餐。我還計劃更新我的博客,說明我爲什麼開發它。
開源項目在github上: https://github.com/aspnet-plus/AspNet.Plus.Infrastructure 查看使用示例。
您是否想抓住完全隨意的異常?或者導致請求失敗的異常?如果它試圖捕獲所有異常,那麼這是不現實的,因爲大多數異常都是由系統的某些部分捕獲和處理的(然後饋送給記錄器)。如果您發現某些例外情況未記錄,請在https://github.com/aspnet/(例如MVC或XRE)上的相應回購中記錄一個錯誤。 – Eilon 2015-02-11 16:56:53
是的,那是爲什麼它沒有工作,因爲我抓住了他們在較低層,但是當我臨時評論捕獲,只有過濾器的方法,讓我趕上拋出的異常,我沒有得到它在ILogger,這是正常的行爲?如果沒有,我可以再次嘗試(因爲我目前實施了全局過濾器方法),如果是這種情況,我可以在github上寫下它。 – 2015-02-11 18:36:59
是的,如果你發現異常,沒有其他人會看到它,所以沒有什麼可以記錄的。但是,您可能確實有一些其他組件,例如錯誤處理中間件,它不記錄異常。可能適合https://github.com/aspnet/Diagnostics回購。 – Eilon 2015-02-11 19:51:03