Возможно, вам уже поздно помогать, но вы могли бы применить фильтр. http://www.mail -archive.com / log4net-user% 40logging.apache.org / msg02517.html показывает, как реализовать фильтр для ограничения частоты регистрации исключения (если тип исключения совпадает с последним исключением). введите и если прошло меньше определенного времени).
Вот фактический исходный код фильтра по этой ссылке:
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; }
}
}
Это будет настроено так:
<filter type="Company.Project.Logging.ExceptionThrottleFilter">
<threshold value="2" />
<exceptionType value="System.ApplicationException" />
</filter>
Похоже, было бы довольно просто изменить его на "дроссельные" сообщения, которые повторяются. Может быть что-то вроде этого (не проверено):
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;
}
}
Было бы неплохо аннотировать зарегистрированное сообщение тем, сколько раз оно повторялось, но как это сделать, для меня не очевидно:
Some message.
Some message.
Some message.
Look, a new message.
Some message.
Some message.
Look, a new message.
Может генерировать что-то вроде этого:
Some message. (3 times)
Look, a new message.
Some message. (2 times)
Look, a new message.
Возможно, это какой-то ForwardingAppender или BufferingForwardingAppender. Это всегда будет одно сообщение позади. Приходит сообщение. «RepeatedMessageAppender» будет содержать это сообщение. Приходит следующее сообщение. Если оно отличается от последнего сообщения, перенаправьте последнее сообщение «реальному» Appender (если «повторный счет»> 0, добавьте номер к последнему сообщению перед пересылкой - это та часть, которой я являюсь не уверен, потому что я думаю, что это не легко изменить LoggingEvent, который передается Appender). Если оно совпадает с последним сообщением, увеличьте счетчик и не пересылайте. Поскольку «RepeatedMessageAppender» отстает, это, вероятно, должен быть BufferingForwardingAppender, и он должен реализовывать Flush.
Может быть, вы (или кто-то еще) сочтете эту информацию полезной.