Il est probablement trop tard pour vous aider, mais vous pouvez implémenter un filtre. http://www.mail-archive.com/log4net-user%40logging.apache.org/msg02517.html montre comment implémenter un filtre pour limiter la fréquence de journalisation d'une exception (si le type d'exception est le même que le dernier type d'exception et si moins d'une durée spécifiée est dépassée).
Voici le code source de filtre réelle de ce lien:
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; }
}
}
Il serait configuré comme ceci:
<filter type="Company.Project.Logging.ExceptionThrottleFilter">
<threshold value="2" />
<exceptionType value="System.ApplicationException" />
</filter>
Il semble que ce serait assez simple de le modifier à « gaz "messages qui répètent. Peut-être quelque chose comme ça (non testé):
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;
}
}
Il pourrait être agréable d'annoter un message connecté avec combien de fois il a été répété, mais comment le faire est pas évident pour moi:
Some message.
Some message.
Some message.
Look, a new message.
Some message.
Some message.
Look, a new message.
Pourrait générer quelque chose comme ceci:
Some message. (3 times)
Look, a new message.
Some message. (2 times)
Look, a new message.
Probablement une sorte de ForwardingAppender ou BufferingForwardingAppender. Ce serait toujours un message derrière. Un message arrive. Le message "RepeatedMessageAppender" contient ce message. Le message suivant entre. Si le message est différent du dernier message, transmettre le dernier message au "réel" Appender (si le "compte répété" est> 0, ajouter le numéro au dernier message avant le transfert - c'est la partie que je suis Je ne suis pas sûr parce que je pense qu'il n'est pas facile de modifier le LoggingEvent qui est passé à l'Appender). Si c'est le même que le dernier message, incrémentez le compteur et ne retransmettez pas. Puisque le "RepeatedMessageAppender" est un derrière, il doit probablement être un BufferingForwardingAppender et il doit implémenter Flush.
Peut-être que vous (ou quelqu'un d'autre) trouverez cette information utile.
Très utile en effet. Pour le marquage "combien de fois", je suggère d'utiliser une propriété pour stocker le nombre de fois, puis de l'afficher via un PatternLayout, comme value = "% message (% property {numberOfSimilar} times)". La propriété peut être définie dans Decide (LoggingEvent) par GlobalContext.Properties ["numberOfSimilar"] ++; – PPC
il n'est jamais trop tard ... – KornMuffin