2012-12-15 24 views
11

Có cách nào để cấu hình NLog tự động đăng nhập tất cả ngoại lệ mà ứng dụng của tôi có thể gửi không? Hiện tại tôi đang đi đến tất cả các khối TRY/CATCH và tự thêm đăng nhập vào CATCH - nhưng nếu tôi bỏ lỡ một số thì sao? Và điều gì sẽ xảy ra nếu trong tương lai người khác làmNLog được cấu hình để tự động đăng nhập tất cả ngoại lệ?

Có cách nào để yêu cầu NLog luôn đăng nhập tất cả ngoại lệ không? Esspecially một số mà không bị bắt và có thể gây ra một popup?

Trả lời

15

Theo như tôi biết, không có cách nào để nhốtNghe để đăng nhập tất cả ngoại lệ.

Nếu tất cả những gì bạn muốn là đăng nhập ngoại lệ không được xử lý, bạn có thể thêm "Trình xử lý ngoại lệ UnhandledException" vào AppDomain khi khởi tạo ứng dụng của bạn. Lưu ý rằng trong một số trường hợp, có thể không thể ghi lại lỗi (ví dụ: trong trường hợp ngoại lệ OutOfMemory hoặc điều gì đó khủng khiếp).

Lưu ý rằng AppDomain cũng có sự kiện FirstChanceException bạn có thể đăng ký, nhưng điều này có nghĩa là bạn sẽ được thông báo về mọi ngoại lệ xảy ra (và có thể được xử lý bởi mã người dùng).

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException); 

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // use logger here to log the events exception object 
    // before the application quits 
} 

Lưu ý rằng điều này sẽ chỉ cho phép bạn đăng nhập ngoại lệ gây tai nạn để ứng dụng của bạn - bạn không thể ngăn chặn nó sụp đổ (do đó tên: unhandled exception).

Một tùy chọn khác là sử dụng Lập trình hướng khía cạnh (AOP) - và giới thiệu khía cạnh Ghi nhật ký sau mỗi cuộc gọi phương pháp, trong trường hợp có lỗi. Nếu ứng dụng của bạn sử dụng kiến ​​trúc Lớp, điều này có thể tương đối dễ dàng (ví dụ: thêm khía cạnh cho tất cả các cuộc gọi của lớp logic nghiệp vụ của bạn ...).

Bạn có thể tìm thấy một khuôn khổ như PostSharp hoặc Spring.Net hữu ích (thường trang web của họ cung cấp một số ví dụ dễ dàng cho điều đó).

+0

phạm vi của AppDomain này là gì? Nó có bắt được tất cả ngoại lệ chưa được giải quyết trong dự án của tôi hay chỉ cho mỗi lớp học? Ngoài ra tôi tham khảo một số DLL những gì về ngoại lệ từ những người? Tôi có cần phải thêm mã này vào mỗi DLL (đó là dự án riêng của họ)? – JSchwartz

+1

Tên miền ứng dụng là khái niệm .net để xác định ranh giới riêng biệt cho một ứng dụng. Nếu bạn tạo một ứng dụng Console, nó sẽ được thực hiện trong một AppDomain. Tất cả các assembly được yêu cầu sẽ được nạp trong cùng một AppDomain. Nếu một cái gì đó xảy ra trong ứng dụng của bạn (không có vấn đề trong những gì lắp ráp) nó sẽ xảy ra trong cùng một appdomain. Thông thường, bạn chỉ đặt mã ví dụ một lần vào đầu ứng dụng của mình (ví dụ: trong phương pháp chính của ứng dụng của bạn hoặc trong trường hợp WebApp trong global.asax trong phương thức application_start). xem http://msdn.microsoft.com/en-us/library/system.appdomain.aspx –

0

Đối WebAPI ứng dụng mà bạn có thể làm điều này trong Global.asax.cs như thế

protected void Application_Error() 
{ 
    Exception lastException = Server.GetLastError(); 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Fatal(lastException); 
} 

MSDN resource

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