2015-02-07 26 views
15

Làm cách nào để đính kèm logic ghi nhật ký của riêng tôi vào ứng dụng ASP.NET 5 để xử lý từng ngoại lệ được ném trong logic nghiệp vụ và các lớp thấp hơn?Xử lý ngoại lệ toàn cầu trong ASP.NET 5

Tôi đã thử với riêng việc thực hiện ILoggerProviderloggerfactory.AddProvider(new LoggerProvider(Configuration)) trong Startup.cs. Nhưng có vẻ như nó chặn các công cụ bên trong ASP.NET, và không phải là ngoại lệ được ném của tôi trong các lớp thấp hơn.

+0

Bạn đang tìm cách bắt các ngoại lệ hoàn toàn tùy ý? Hoặc các trường hợp ngoại lệ kết thúc gây ra yêu cầu không thành công? Nếu nó cố gắng để bắt * tất cả * ngoại lệ, đó là không thực tế có thể bởi vì hầu hết các trường hợp ngoại lệ được bắt và xử lý bởi các bộ phận của hệ thống (và sau đó ăn cho một logger). Nếu bạn thấy rằng một số ngoại lệ không được ghi lại, vui lòng đăng nhập một lỗi trong repo thích hợp trên https://github.com/aspnet/ (ví dụ: MVC hoặc XRE). – Eilon

+0

Vâng, đó là lý do tại sao nó không hoạt động, bởi vì tôi bắt chúng ở các tầng thấp hơn, nhưng khi tôi tạm thời nhận xét đánh bắt, chỉ có cách tiếp cận bộ lọc mới cho phép tôi bắt được ngoại lệ ném, tôi đã không nhận được nó trong ILogger, đây có phải là hành vi bình thường không? Nếu không, tôi có thể thử lại một lần nữa (vì hiện tại tôi đã thực hiện phương pháp Global Filter), và nếu đó là trường hợp tôi có thể viết về nó trên github. –

+0

Vâng, nếu bạn bắt được ngoại lệ, không ai khác sẽ nhìn thấy nó, vì vậy không có gì để đăng nhập. Nhưng bạn có thể rất đúng khi có một số thành phần khác, chẳng hạn như xử lý lỗi phần mềm trung gian, không ghi nhật ký ngoại lệ. Có thể phù hợp với https://github.com/aspnet/Diagnostics repo. – Eilon

Trả lời

10

Làm việc nó ra, bằng cách sử dụng hai lựa chọn:

1) ILoggerProvider Thực hiện ILoggerProvider và ILogger của riêng bạn từ Microsoft.Framework.Logging namespace Sau đó gắn nó vào khung MVC trong Startup.cs thêm đoạn mã sau:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
{ 
     loggerfactory.AddProvider(new YourCustomProvider()); 
} 

Nhưng tùy chọn ở trên này, dường như chỉ gọi Viết chức năng của ILogger trên MVC sự kiện cụ thể, liên quan đến định tuyến và như vậy, nó không được gọi khi tôi ném ngoại lệ trên lớp thấp hơn tôi, vì vậy thứ hai tùy chọn đã được thực hiện:

2) Lọc toàn cầu đăng ký thực hiện ActionFilterAttribute của riêng bạn trong Startup.cs:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc().Configure<MvcOptions>(options => 
    { 
     options.Filters.Add(new YourCustomFilter()); 
    }); 
} 

Điều quan trọng là, rằng lớp lọc tùy chỉnh thực hiện các interace IExceptionFilter:

public class YourCustomFilter : ActionFilterAttribute, IExceptionFilter 
    { 
      public void OnException(ExceptionContext context) 
      { 
       ///logic... 
      } 
} 

(EDIT :) Và sau đó trong lớp Khởi động, chúng tôi thêm bộ lọc:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(options => 
      { 
       options.Filters.Add(new YourCustomFilter()); 
      }); 
    } 
+0

Có thể cập nhật nội dung phản hồi từ phương thức 'OnException' không? Tôi có thể cập nhật mã trạng thái, nhưng tôi cũng muốn cập nhật nội dung phản hồi nhưng tôi không tìm thấy cách – RPDeshaies

+2

Có, có thể, bằng cách đặt ExceptionContext được cung cấp cho phương thức OnException. Ví dụ: context.Result = new RedirectResult ... hoặc context.Result = new JsonResult .... –

+1

@alekkowalczyk Xin chào Tôi đã làm theo ví dụ của bạn và cú pháp đã làm việc cho tôi ở bước thứ hai có một chút khác biệt. Đây là phiên bản của tôi, có lẽ có thể giúp người khác, services.AddMvc ((options => { options.Filters.Add (CustomFilerForExceptionHandling mới());} )); – Juan

2

Nếu bạn muốn có một khung bẫy ngoại lệ thực sự toàn cục, không chỉ ở cấp điều khiển, hãy xem một trong các dự án mã nguồn mở của tôi. Tôi dự định biến nó thành Gói Nuget ngay sau kỳ nghỉ. Tôi cũng đang lên kế hoạch cập nhật blog của mình cho thấy lý do tôi phát triển nó.

Dự án nguồn mở là trên github: https://github.com/aspnet-plus/AspNet.Plus.Infrastructure Hãy xem mẫu để sử dụng.

Các vấn đề liên quan