2010-02-18 3 views
10

Có cách nào để ghi nhật ký sự kiện vào nhật ký sự kiện của cửa sổ với một eventid được chỉ định cho mỗi tin nhắn không? Tôi đang sử dụng log4net v 1.2.10.Log4net EventLogAppender Log Event ID

Trả lời

5

Vâng, giải pháp là để xây dựng dự án mở rộng "log4net.Ext.EventID" và sử dụng các loại của nó:. IEventIDLog, EventIDLogImpl và EventIDLogManager

+0

Đối với những người khác, hãy xem "Khả năng mở rộng - EventIDLogApp" trong http://logging.apache.org/log4net/release/example-apps.html. Mẫu được bao gồm trong nguồn tải xuống từ http://logging.apache.org/log4net/download_log4net.cgi –

17

Dựa trên những gì tôi nhìn thấy trong mã nguồn EventLogAppender sau nên làm như lừa:

log4net.ThreadContext.Properties [ "EventID"] = 5;

Chỉ cần gọi này trước khi bạn viết tin nhắn đăng nhập của bạn (nếu bạn không cài đặt nó cho tất cả các tin nhắn bạn nên loại bỏ "EventID" một lần nữa từ Properties.

NB phím sở hữu là trường hợp nhạy cảm.

2

một giải pháp khác là thêm một tùy chỉnh Filter như đã mô tả ở đây: Enhancing log4net exception logging(liên kết trực tiếp đến số Gist chỉ trong trường hợp).

Như tác giả chỉ ra:

... EventLogAppender sử dụng consts inline để kiểm tra chúng. Một khi chúng được thêm vào, chúng sẽ được EventLogAppender sử dụng để đánh dấu các mục đã cho với EventId và Category.

Việc thực hiện bộ lọc sẽ trông giống như mã dưới đây (rút gọn ý chính) với lợi ích bổ sung rằng nếu bạn thực hiện GetEventId phương pháp nào, bạn có thể viết một số bài kiểm tra chống lại nó

public class ExceptionBasedLogEnhancer : FilterSkeleton 
{ 
    private const string EventLogKeyEventId = "EventID"; 

    public override FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
     var ex = loggingEvent.ExceptionObject; 
     if (ex != null) 
     { 
      loggingEvent.Properties[EventLogKeyEventId] = GetEventId(ex); 
     } 

     return FilterDecision.Neutral; 
    } 

    private static short GetEventId(Exception ex) 
    { 
     // more fancy implementation, like getting hash of ex properties 
     // can be provided, or mapping types of exceptions to eventids 
     // return no more than short.MaxValue, otherwise the EventLog will throw 
     return 0; 
    } 
} 
5

Khi một sử dụng các bản ghi sự kiện .net gốc trong System.Diagnostics, các phương thức WriteEntry cho phép thiết lập eventID và category. Trong các API:

  • eventID là 32 bit int, nhưng giá trị của nó phải nằm giữa 0 và 65535
  • loại là một 16 bit int, nhưng giá trị của nó phải là số dương. Nếu nguồn sự kiện bao gồm category resource file, trình xem sự kiện sẽ sử dụng giá trị danh mục số nguyên để tra cứu chuỗi "Danh mục nhiệm vụ" được bản địa hoá. Nếu không, giá trị số nguyên sẽ được hiển thị. Các categories must be numbered consecutively, bắt đầu với số 1

Log4net hỗ trợ viết một EventID và một loại, nhưng nó không phải là thẳng về phía trước. Khi EventLogAppender của log4net ghi lại một sự kiện, nó sẽ xem xét một từ điển thuộc tính. Các thuộc tính được đặt tên "EventID" và "Category" được tự động ánh xạ bởi EventLogAppender tới các giá trị tương ứng trong bản ghi sự kiện. Tôi đã thấy một vài cách được đề xuất tốt để sử dụng EventLogAppender của log4net và đặt EventID và Danh mục trong nhật ký sự kiện Windows.

a. Sử dụng tính năng lọc ứng dụng của log4net, filter may be registered có thể thêm thuộc tính EventID và Danh mục. Phương pháp này có một lợi ích tốt đẹp mà các trình bao bọc tiêu chuẩn log4net được sử dụng và do đó, điều này có thể được thực hiện mà không thay đổi mã đăng nhập hiện có.Khó khăn trong phương pháp này là một số cơ chế phải được tạo ra để tính EventID và Category từ thông tin đã đăng nhập. Ví dụ, bộ lọc có thể xem xét nguồn ngoại lệ và ánh xạ nguồn đó tới một giá trị Category.

b. Log4net có thể được mở rộng để các trình bao bọc ghi nhật ký tùy chỉnh có thể được sử dụng có thể bao gồm các tham số EventID và Category. Thêm EventID được thể hiện trong mẫu log4net “Extensibility - EventIDLogApp” được bao gồm trong nguồn log4net. Trong mẫu mở rộng, một giao diện mới (IEventIDLog) được sử dụng để mở rộng giao diện ILog tiêu chuẩn được các ứng dụng sử dụng để ghi nhật ký. Điều này cung cấp các phương thức ghi nhật ký mới bao gồm tham số eventId. Các phương thức ghi nhật ký mới thêm eventId vào từ điển Properties trước khi ghi sự kiện.

public void Info(int eventId, object message, System.Exception t) 
{ 
     if (this.IsInfoEnabled) 
     { 
      LoggingEvent loggingEvent = new LoggingEvent(ThisDeclaringType, Logger.Repository, Logger.Name, Level.Info, message, t); 
      loggingEvent.Properties["EventID"] = eventId; 
      Logger.Log(loggingEvent); 
     } 
} 

c. Log4net hỗ trợ một đối tượng ThreadContext có chứa một từ điển Properties. Một ứng dụng có thể thiết lập các thuộc tính EventID và Category trong từ điển này và sau đó khi thread gọi phương thức logging, các giá trị sẽ được EventLogAppender sử dụng.

log4net.ThreadContext.Properties["EventID"] = 5; 

Một số tài liệu tham khảo hữu ích:

0

Mở rộng ILog.Info() để có một sự kiện ID:

public static class LogUtils 
{ 
    public static void Info(this ILog logger, int eventId, object message) 
    { 
     log4net.ThreadContext.Properties["EventID"] = eventId; 
     logger.Info(message); 
     log4net.ThreadContext.Properties["EventID"] = 0; // back to default 
    } 
} 

Sau đó gọi nó là như thế này:

using LogUtils; 
private static readonly log4net.ILog _logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

_logger.Info(3, "First shalt thou take out the Holy Pin, then shalt thou count to three.");