Đâ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.
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
không bao giờ là quá muộn ... – KornMuffin