2009-07-30 27 views
7

Tôi có một thành phần liên tục đọc một giá trị từ một thiết bị. Hiện tại nó cập nhật mỗi {n} giây và ghi nhật ký một thông báo gỡ lỗi với giá trị vào một phiên bản của ILog.log4net - bất kỳ bộ lọc nào chỉ ghi nhật ký thư Nth?

Mỗi giây là quá thường xuyên đối với tôi, tôi chỉ không quan tâm và nó ăn quá nhiều không gian đăng nhập. Tuy nhiên, tôi chắc chắn sẽ quan tâm đến việc thu thập mọi thông điệp thứ 10 hoặc 30 từ thành phần đó để tôi có thể nắm được ý chính của những gì nó đang làm.

Có ai biết cách nào để thực hiện việc này không liên quan đến việc tôi thực hiện triển khai ILog của riêng mình không?

Trả lời

11

Đây có thể là quá muộn để trợ giúp bạn, nhưng bạn có thể triển khai bộ lọc. http://www.mail-archive.com/log4net-user%40logging.apache.org/msg02517.html cho biết cách triển khai bộ lọc để giới hạn tần suất một ngoại lệ được ghi lại (nếu loại ngoại lệ giống với loại ngoại lệ cuối cùng và nếu ít hơn một khoảng thời gian đã chỉ định đã trôi qua).

Đây là mã nguồn bộ lọc thực tế từ liên kết đó:

public class ExceptionThrottleFilter : FilterSkeleton 
{ 
    private DateTime lastException = DateTime.MinValue; 
    private Type exceptionType = typeof(Exception); 
    private int threshold = 5; // seconds 

    public override void ActivateOptions() 
    { 
    base.ActivateOptions(); 
    } 

    public override FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
    if (loggingEvent.ExceptionObject != null && loggingEvent.ExceptionObject.GetType) == exceptionType) 
    { 
     if (loggingEvent.TimeStamp.Subtract(lastException).TotalSeconds > threshold) 
     { 
     lastException = loggingEvent.TimeStamp; 
     return FilterDecision.Accept; 
     } 
     else 
     { 
     return FilterDecision.Deny; 
     } 
    } 
    else 
    { 
     return FilterDecision.Neutral; 
    } 
    } 

    public Type ExceptionType 
    { 
    get { return exceptionType; } 
    set { exceptionType = value; } 
    } 

    public int Threshold 
    { 
    get { return threshold; } 
    set { threshold = value; } 
    } 
} 

Nó sẽ được cấu hình như thế này:

<filter type="Company.Project.Logging.ExceptionThrottleFilter"> 
    <threshold value="2" /> 
    <exceptionType value="System.ApplicationException" /> 
</filter> 

Nó có vẻ như nó sẽ là khá đơn giản để thay đổi nó thành "ga "tin nhắn lặp lại. Có lẽ một cái gì đó như thế này (chưa được kiểm tra):

public class DuplicateMessageThrottleFilter : FilterSkeleton 
{ 
    private string lastMessage; 

    public override void ActivateOptions() 
    { 
    base.ActivateOptions(); 
    } 

    public override FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
    string newMessage; 
    if (loggingEvent.MessageObject != null) 
    { 
     newMessage = loggingEvent.MessageObject.ToString(); 
    } 

    if (newMessage.Equals(lastMessage)) 
    { 
     return FilterDecision.Deny; 
    } 

    lastMessage = newMessage; 
    return FilterDecision.Accept; 
    } 
} 

Nó có thể là tốt đẹp để chú thích một thông điệp đăng nhập với bao nhiêu lần nó được lặp lại, nhưng làm thế nào để làm điều đó là không rõ ràng với tôi:

Some message. 
Some message. 
Some message. 
Look, a new message. 
Some message. 
Some message. 
Look, a new message. 

Có thể tạo ra một cái gì đó như thế này:

Some message. (3 times) 
Look, a new message. 
Some message. (2 times) 
Look, a new message. 

Có lẽ một số loại ForwardingAppender hoặc BufferingForwardingAppender. Nó sẽ luôn là một thông điệp phía sau. Một thông báo xuất hiện. "RepeatedMessageAppender" sẽ giữ thông điệp đó. Thông báo tiếp theo xuất hiện. Nếu nó khác với tin nhắn cuối cùng, chuyển tiếp tin nhắn cuối cùng đến "Appender" thực (nếu "repeat count" là> 0, thêm số vào tin nhắn cuối cùng trước khi chuyển tiếp - đây là phần mà tôi không chắc chắn về bởi vì tôi nghĩ rằng nó không phải là dễ dàng để sửa đổi LoggingEvent được truyền cho Appender). Nếu nó giống như thông điệp cuối cùng, bộ đếm gia tăng và không chuyển tiếp. Kể từ khi "RepeatedMessageAppender" là một phía sau, nó có lẽ phải là một BufferingForwardingAppender và nó phải thực hiện Flush.

Có thể bạn (hoặc người khác) sẽ thấy thông tin này hữu ích.

+0

Thực sự hữu ích. Đối với việc gắn thẻ "bao nhiêu lần", tôi sẽ đề xuất sử dụng thuộc tính để lưu trữ số lần, sau đó hiển thị nó thông qua PatternLayout, như giá trị = "% tin nhắn (% thuộc tính {numberOfSimilar} lần)". Thuộc tính có thể được thiết lập trong Decide (LoggingEvent) bởi GlobalContext.Properties ["numberOfSimilar"] ++; – PPC

+0

không bao giờ là quá muộn ... – KornMuffin

1

Phụ thuộc vào những gì bạn đang ghi nhật ký. Nếu có một thứ gì đó được ghi lại mỗi giây, thì có lẽ bạn nên xem lại những gì bạn đang đăng nhập.

Bạn có thể băm các thư tương tự và in chúng sau một thời gian.

+0

Tôi không đăng nhập, tôi vô hiệu hóa đăng nhập cấp độ gỡ lỗi cho thành phần đó nhưng tôi giữ nó như một tùy chọn tất nhiên nếu tôi muốn ghi lại giá trị mà ứng dụng nghĩ là hiện có trên thiết bị. Hashing âm thanh như một giải pháp tốt là có một cách dễ dàng để cấu hình nó? –

+0

Tôi không đồng ý với "băm tương tự và chờ in": Đây là trách nhiệm của cơ chế ghi nhật ký, chứ không phải của mã doanh nghiệp của bạn để tự hỏi nên in những gì.Máy của bạn cho biết "Tôi đang lên" mỗi giây, và đó là logic đăng nhập của bạn sẽ dịch nó thành "lên từ 13:44", không phải bản thân máy, đặc biệt nếu bạn cần hai bản ghi khác nhau, chỉ có một bản được cắt ngang bởi cơ chế. – PPC

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