2015-02-07 82 views
15

如何將我自己的日誌記錄邏輯附加到ASP.NET 5應用程序以處理業務邏輯和較低層中引發的每個異常?ASP.NET 5中的全局異常處理

我試着在Startup.cs中用自己的ILoggerProvider實現和loggerfactory.AddProvider(new LoggerProvider(Configuration))。但它似乎攔截了ASP.NET內部的東西,而不是我在低層拋出的異常。

+0

您是否想抓住完全隨意的異常?或者導致請求失敗的異常?如果它試圖捕獲所有異常,那麼這是不現實的,因爲大多數異常都是由系統的某些部分捕獲和處理的(然後饋送給記錄器)。如果您發現某些例外情況未記錄,請在https://github.com/aspnet/(例如MVC或XRE)上的相應回購中記錄一個錯誤。 – Eilon 2015-02-11 16:56:53

+0

是的,那是爲什麼它沒有工作,因爲我抓住了他們在較低層,但是當我臨時評論捕獲,只有過濾器的方法,讓我趕上拋出的異常,我沒有得到它在ILogger,這是正常的行爲?如果沒有,我可以再次嘗試(因爲我目前實施了全局過濾器方法),如果是這種情況,我可以在github上寫下它。 – 2015-02-11 18:36:59

+0

是的,如果你發現異常,沒有其他人會看到它,所以沒有什麼可以記錄的。但是,您可能確實有一些其他組件,例如錯誤處理中間件,它不記錄異常。可能適合https://github.com/aspnet/Diagnostics回購。 – Eilon 2015-02-11 19:51:03

回答

10

工作了,通過使用兩個選項:

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()); 
      }); 
    } 
+0

是否可以通過'OnException'方法更新響應內容?我可以更新狀態碼,但我想更新響應主體,但我不知道 – RPDeshaies 2015-07-15 12:28:13

+2

是的,這可能是通過設置提供給OnException方法的ExceptionContext。例如context.Result = new RedirectResult ...或context.Result = new JsonResult .... – 2015-07-15 14:21:03

+1

@alekkowalczyk嗨,我跟着你的例子,在第二步中爲我工作的語法有點不同。這裏是我的版本,也許可以幫助別人, services.AddMvc((options => { options.Filters.Add(new CustomFilerForExceptionHandling()); })); – Juan 2015-10-21 14:57:36

2

如果您需要一個真正的全局異常陷阱框架,而不僅僅是在控制器級別,請查看我的一個開源項目。我計劃在節假日後不久將它變成一個Nuget套餐。我還計劃更新我的博客,說明我爲什麼開發它。

開源項目在github上: https://github.com/aspnet-plus/AspNet.Plus.Infrastructure 查看使用示例。