Pregunta sobre winforms, log4net, c# – Log4Net MemoryAppender parece perder eventos de registro de alta velocidad

1

Estoy usando un Log4net MemoryAppender para mostrar mi salida de log4net en un cuadro de texto del formulario. La parte relevante de mi archivo de configuración es:

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level %date %message%newline" />
    </layout>
</appender>

El código que actualiza el formulario es activado por un temporizador y se ve así:

var events = _memoryAppender.GetEvents();

foreach (var loggingEvent in events)
{
    textBoxOutput.Text += loggingEvent.Level + "  " + loggingEvent.MessageObject + Environment.NewLine;
}
_memoryAppender.Clear();

Está funcionando, pero cuando mi aplicación registra muchos mensajes en un corto período de tiempo, parece que no los veo. ¿Alguien tiene una idea de lo que está pasando?

Como una solución estoy usandoMotosierra y un appender UDP:

   <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO"/>
        <param name="LevelMax" value="ERROR"/>
    </filter>
    <param name="RemoteAddress" value="127.0.0.1" />
    <param name="RemotePort" value="8080" />
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j, log4net" />
</appender>

Sin embargo, me gusta más mi propia interfaz de usuario, por lo que sigo buscando respuestas.

Guay. Gracias. chrismead
En caso de que le importe, hay una instantánea del desarrollador de Chainsaw con un montón de nuevas funciones, verifique aquí:people.apache.org/~sdeboy Scott

Tu respuesta

1   la respuesta
3

Mientras escribe sus mensajes de registro en el cuadro de texto, los mensajes nuevos se registran. Cuando borra los mensajes en el appender, también elimina estos nuevos mensajes, que no se escriben en el cuadro de texto.

Puede mejorar la situación borrando el appender antes de comenzar a escribir mensajes en el cuadro de texto, pero creo que debe crear su propio appender de memoria y proporcionar un método que devuelva los mensajes y borre la matriz en un solo paso. Algo como esto:

public class MyMemoryAppender : MemoryAppender
{
    public LoggingEvent[] GetAndClearEvents()
    {
        lock (m_eventList.SyncRoot)
        {
            var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
            m_eventsList.Clear();
            return events;
        }
    }
}
Todavía no podía hacerlo funcionar, pero el problema podría estar en otro lugar de mi proyecto. Gracias por la idea! chrismead
Increíble. Suena como un buen consejo. Lo comprobaré tan pronto como vuelva al trabajo. chrismead

Preguntas relacionadas