2009-08-18 32 views
6

Làm cách nào để lấy Khối ứng dụng xử lý ngoại lệ (EHAB) để ghi các giá trị từ thuộc tính Exception.Data trong nhật ký?Ngoại lệ. Thiếu thông tin dữ liệu trong EntLib log

try 
    { 
    // ... 
    } 
    catch (Exception ex) 
    { 
    ex.Data.Add("Hello", "World"); 
    throw ex; 
    } 

Ngoại lệ được ghi chính xác nhưng tôi không thể tìm thấy dữ liệu được thêm vào bất kỳ nơi nào trong mục nhập nhật ký được tạo bởi EHAB.

Theo như tôi hiểu, đó là phương pháp được khuyến nghị để thêm thông tin bổ sung có liên quan vào chính ngoại lệ như trong ví dụ trên. Đó là lý do tại sao tôi hơi ngạc nhiên khi EHAB không bao gồm điều này theo mặc định.

Tôi có thể sửa lỗi này bằng cách sửa đổi mẫu với Trình chỉnh sửa mẫu định dạng văn bản EntLib (ảnh chụp màn hình dưới đây) không? Tôi không thể tìm thấy bất kỳ thông tin nào về các "thẻ" khác nhau được cung cấp, nhưng tôi cho rằng câu trả lời được ẩn ở đâu đó với chúng.

Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png

Hoặc làm tôi thực sự cần phải thực hiện riêng tùy chỉnh chữ Formatter của tôi để thực hiện điều này?

EDIT/UPDATE:

Tôi làm điều này trong Global.asax.cs của tôi để tránh phải thêm lời gọi phương thức HandleException ở khắp mọi nơi trong mã của tôi:

using EntLib = Microsoft.Practices.EnterpriseLibrary; 
using System; 

namespace MyApp 
{ 
    public class Global : System.Web.HttpApplication 
    { 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // I have an "All Exceptions" policy in place... 
     EntLib.ExceptionHandling.ExceptionPolicy.HandleException(Server.GetLastError(), "All Exceptions"); 
     // I believe it's the GetLastError that's somehow returning a "lessor" exception 
    } 
    } 
} 

Hóa ra đây là không phải là giống như điều này (hoạt động tốt và chủ yếu giải quyết được vấn đề của tôi):

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("Hello", "World"); 
    bool rethrow = ExceptionPolicy.HandleException(ex, "Log Only Policy"); 
    throw ex; 
} 

Đi qua tất cả các mã và thêm try-catch's với một cuộc gọi HandleException dường như ... tốt, ngu ngốc. Tôi đoán vấn đề của tôi thực sự là làm thế nào để sử dụng EHAB đúng cách, không phải cấu hình.

Bất kỳ đề xuất nào về cách tôi có thể đúng ghi lại tất cả các ngoại lệ về "mức toàn cầu" trong ứng dụng web ASP.NET ??

+0

Tôi đồng ý với HandleException: là một khuôn khổ, cấu trúc "nếu rethrow" không thực sự mang lại nhiều trừu tượng; bạn vẫn cần phải tiêu mã của bạn với mã "nếu rethrow" trong mỗi khối catch. –

Trả lời

7

Bạn không cần phải tạo trình định dạng của riêng mình.

Mỗi mục trong ID dữ liệu từ điển trên đối tượng ngoại lệ được thêm vào từ điển ExtendedProperties của đối tượng LogEntry và được ghi nhật ký (nếu được chỉ định bởi trình định dạng).

Thuộc tính mở rộng: đoạn mã cấu hình {dictionary ({key} - {value})} sẽ ghi nhật ký tất cả các cặp khóa/giá trị trong từ điển thuộc tính mở rộng. Nếu bạn muốn đăng nhập chỉ một mục từ bộ sưu tập, bạn có thể sử dụng "keyvalue". Trong ví dụ của bạn nó sẽ là một cái gì đó dọc theo dòng:

Hello Key: {keyvalue(Hello)} 


Tôi đổi ExceptionHandlingWithLoggingQuickStart thêm Data.Add ("Hello", "Thế giới") và tôi thấy "Properties mở rộng: Xin chào - Thế giới" ở cuối mục Nhật ký Sự kiện. Vì vậy, nó đang làm việc.

Nếu bạn không nhìn thấy hành vi đó, bạn cần phải đảm bảo:

  • Đó ngoại trừ của bạn với các mục dữ liệu bổ sung được thông qua vào ExceptionPolicy.HandleException
  • Đó chính sách quy định tại các phương pháp HandleException được cấu hình để đăng nhập với một LoggingExceptionHandler trong cấu hình
  • Đó là định dạng được chỉ định trong các LoggingConfiguration được cấu hình để hỗ trợ ExtendedProperties


Nếu bạn có thể Không thấy vấn đề là gì so sánh những gì bạn có với những gì có trong QuickStart. Nếu nó vẫn không hoạt động, hãy đăng mã của bạn và cấu hình của bạn.

UPDATE:

Nếu bạn đang đi để xử lý Application_Error trong global.asax sau đó bạn sẽ nhận được một HttpUnhandledException vì trang đã không xử lý các lỗi. Bạn có thể lấy ra Exception mà bạn quan tâm bằng cách sử dụng thuộc tính InnerException; InnerException sẽ chứa ngoại lệ ban đầu (trừ khi nó nằm trong ngoại lệ của ngoại lệ đó :)). Cách khác, bạn có thể sử dụng Server.GetLastError().GetBaseException() để truy xuất ngoại lệ là nguyên nhân gốc.

+0

Cảm ơn! Câu trả lời của bạn là một trong những câu trả lời tốt nhất mà tôi đã nhận được trên SO cho đến bây giờ. Chính xác và cho điểm. Quá tệ tôi chỉ có thể cung cấp cho bạn +1 và chủ đề này không nhận được nhiều sự chú ý. Bạn xứng đáng hơn. :) Tôi đã thử QuickStart và thậm chí đã thay thế cấu hình của riêng mình bằng cấu hình từ mẫu. Sau đó, tôi nhận ra vấn đề là gì: Tôi đã cập nhật câu hỏi và tôi hy vọng bạn cũng có thể giúp tôi với điều này. –

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