Probablemente sea demasiado tarde para ayudarlo, pero podría implementar un filtro. http://www.mail-archive.com/log4net-user%40logging.apache.org/msg02517.html muestra cómo implementar un filtro para limitar la frecuencia con la que se registra una excepción (si el tipo de excepción es el mismo que el último tipo de excepción y si ha transcurrido menos de una cantidad específica de tiempo).
Aquí está el código fuente real del filtro a partir de ese enlace:
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; }
}
}
Sería ser configurado de esta manera:
<filter type="Company.Project.Logging.ExceptionThrottleFilter">
<threshold value="2" />
<exceptionType value="System.ApplicationException" />
</filter>
Parece que sería bastante sencillo modificarlo para "acelerador "mensajes que se repiten. Tal vez algo como esto (no probado):
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;
}
}
podría ser bueno para anotar un mensaje registrado con el número de veces que se repite, pero la forma de hacerlo no es evidente para mí:
Some message.
Some message.
Some message.
Look, a new message.
Some message.
Some message.
Look, a new message.
podría generar algo como esto:
Some message. (3 times)
Look, a new message.
Some message. (2 times)
Look, a new message.
Probablemente algún tipo de ForwardingAppender o BufferingForwardingAppender. Siempre sería un mensaje detrás. Aparece un mensaje. El "RepeatedMessageAppender" contendría ese mensaje. El siguiente mensaje entra. Si es diferente al último mensaje, reenvíe el último mensaje al Appender "real" (si "conteo repetido" es> 0, añada el número al último mensaje antes de reenviar - esta es la parte que soy no estoy seguro porque creo que no es fácil modificar el LoggingEvent que se pasa al Appender). Si es el mismo que el último mensaje, incremente el contador y no reenvíe. Como el "RepeatedMessageAppender" está a una detras, probablemente tiene que ser un BufferingForwardingAppender y debe implementar Flush.
Quizás usted (u otra persona) encuentre esta información útil.
Muy útil de hecho. Para el etiquetado "cuántas veces", sugiero usar una propiedad para almacenar el número de veces, y luego mostrarlo a través de PatternLayout, como value = "% message (% property {numberOfSimilar} times)". La propiedad podría establecerse en Decide (LoggingEvent) por GlobalContext.Properties ["numberOfSimilar"] ++; – PPC
nunca es demasiado tarde ... – KornMuffin