2015-02-07 86 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 查看使用示例。