2010-03-09 44 views
11

chúng tôi đã kết nối log4net với Jira bằng SMTP.Ngăn log4net gửi các vấn đề trùng lặp qua SMTP

Bây giờ chúng tôi lo lắng rằng vì trang web là công khai những gì có thể xảy ra với máy chủ Jira nếu chúng tôi nhận được rất nhiều vấn đề trong môi trường sản xuất.

Chúng tôi đã lọc về Nghiêm trọng và Tử vong, nhưng chúng tôi muốn xem một số dịch vụ acumulator trên log4net hoặc bộ lọc đơn giản xác định các vấn đề lặp lại và ngăn chúng không được gửi qua Email. Tốt hơn là không cần phải thay đổi mã báo cáo lỗi, vì vậy giải pháp cấu hình sẽ là tốt nhất.

Tôi đoán việc bán nhật ký vào một db và sau đó tạo một trình lắng nghe riêng biệt một số mã thông minh sẽ là một thay thế (pricy).

Trả lời

14

lẽ this là đủ cho yêu cầu của bạn:

nó về cơ bản giới hạn số lượng email được gửi trong một khoảng thời gian nhất định. Tôi nghĩ rằng nó nên được khá dễ dàng để tùy chỉnh này theo nhu cầu của bạn. Tôi đã làm một cái gì đó tương tự mà thậm chí loại bỏ các thông điệp trong một khoảng thời gian nhất định:

public class SmtpThrottlingAppender : SmtpAppender 
{ 
    private DateTime lastFlush = DateTime.MinValue; 
    private TimeSpan flushInterval = new TimeSpan(0, 5, 0); 

    public TimeSpan FlushInterval 
    { 
     get { return this.flushInterval; } 
     set { this.flushInterval = value; } 
    } 

    protected override void SendBuffer(LoggingEvent[] events) 
    { 
     if (DateTime.Now - this.lastFlush > this.flushInterval) 
     { 
      base.SendBuffer(events); 
      this.lastFlush = DateTime.Now; 
     } 
    } 
} 

Khoảng tuôn ra có thể được cấu hình như cài đặt bình thường của appenders khác:

<flushInterval value="01:00:00" /> 
+0

Điều này thật tuyệt vời – Hans

+0

Không chắc chắn nếu tôi khá hiểu, nhưng điều này sẽ chờ đợi và sau đó gửi một loạt các email cùng một lúc hoặc không gửi một email với tất cả các sự kiện trong đó? 'Base.SendBuffer (events)' làm gì? Vì OP cũng yêu cầu "_a bộ lọc đơn giản xác định các vấn đề lặp lại và ngăn chúng được gửi_" thì có lẽ điều này có thể được thực hiện bằng cách loại bỏ các mục khỏi mảng 'sự kiện' trước khi gọi' base.SendBuffer (events) '. Thê nay đung không? – Ben

+0

Nó sẽ gửi một email với tất cả các sự kiện. Nếu bạn cần bạn có thể loại bỏ các sự kiện nhất định khỏi mảng trước khi gọi 'base.SendBuffer()'. –

4

Bạn cũng có thể sử dụng một SmtpAppender đơn giản với số log4net.Core.TimeEvaluator làm Người đánh giá.

Giả sử chúng tôi có khoảng thời gian là 5 phút và các sự kiện vào lúc 00:00, 00:01 và 01:00.

  • Stefan Egli SmtpThrottlingAppender sẽ gửi email lúc 00:00 (sự kiện 1) và 01:00 (sự kiện 2 và 3).
  • Một SmtpAppender với một TimeEvaluator sẽ gửi email lúc 00:05 (sự kiện 1 và 2) và 01:05 (sự kiện 3).

Bạn muốn phụ thuộc vào việc bạn bị làm phiền nhiều hơn bởi thời gian trễ được đảm bảo hoặc chậm trễ lớn.

Tôi đã cố gắng kết hợp SmptThrottlingAppender với Bộ định thời gian, nhưng không thể nhận được hành vi mà tôi muốn. Tôi bắt đầu nghi ngờ rằng tôi nên viết một ITriggeringEventEvaluator mới, không phải là một IAppender mới.

+1

Đọc mã nguồn TimeEvaluator http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/TimeEvaluator.cs?revision = 1159605 & view = markup, cách tôi hiểu nó TimeEvaluator sẽ kích hoạt gửi lúc 00:00 (event 1), không kích hoạt lúc 00:01 (vì 5 phút chưa trôi qua kể từ lần kích hoạt trước), và sau đó kích hoạt lại tại 01 : 00 (với sự kiện 2 và 3 tùy thuộc vào bộ đệm, vv) –

+0

Để chính xác hơn, nếu Trình xác định thời gian được tạo lúc 00:00 thì nó sẽ không gửi bất cứ điều gì lúc 00:00 không phải lúc 00:01 – irriss

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