Вопрос по log4net, c#, winforms – Log4Net MemoryAppender, кажется, пропускает события высокоскоростного журнала

1

Я использую log4net MemoryAppender, чтобы показать мой вывод log4net в текстовом поле формы. Соответствующая часть моего файла конфигурации:

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

Код, который обновляет форму, запускается таймером и выглядит так:

var events = _memoryAppender.GetEvents();

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

Это работает, но когда мое приложение регистрирует много сообщений за короткий промежуток времени, я, кажется, не вижу их. У кого-нибудь есть идея, что происходит?

В качестве обходного пути я используюбензопила и 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>

Мне больше нравится мой собственный пользовательский интерфейс, поэтому я все еще ищу ответы.

Здорово. Спасибо. chrismead
Если вам не безразличен моментальный снимок Chainsaw для разработчиков с множеством новых функций, посмотрите его здесь:people.apache.org/~sdeboy Scott

Ваш Ответ

1   ответ
3

пока вы пишете свои сообщения журнала в текстовом поле, новые сообщения регистрируются. Когда вы очищаете сообщения в приложении, вы также удаляете эти новые сообщения, которые не записываются в текстовое поле.

Вы могли бы улучшить ситуацию, очистив appender перед тем, как начать писать сообщения в текстовое поле, но я думаю, что вы должны создать свой собственный appender памяти и предоставить метод, который возвращает сообщения и очищает массив за один шаг. Что-то вроде этого:

public class MyMemoryAppender : MemoryAppender
{
    public LoggingEvent[] GetAndClearEvents()
    {
        lock (m_eventList.SyncRoot)
        {
            var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
            m_eventsList.Clear();
            return events;
        }
    }
}
Я все еще не мог заставить его работать, но проблема вполне могла быть в другом месте в моем проекте. Спасибо за идею! chrismead
Потрясающие. Похоже, хороший совет. Я проверю это, как только вернусь на работу. chrismead

Похожие вопросы