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>

ただし、自分のUIの方が好きなので、まだ答えを探しています。

4

1 に答える 1

3

次のことが起こると仮定します: テキスト ボックスにログ メッセージを書き込んでいる間に、新しいメッセージがログに記録されます。アペンダーのメッセージをクリアすると、テキスト ボックスに書き込まれないこれらの新しいメッセージも削除されます。

テキスト ボックスへのメッセージの書き込みを開始する前にアペンダーをクリアすることで状況を改善できますが、独自のメモリ アペンダーを作成し、メッセージを返し、配列を 1 ステップでクリアするメソッドを提供する必要があると思います。このようなもの:

public class MyMemoryAppender : MemoryAppender
{
    public LoggingEvent[] GetAndClearEvents()
    {
        lock (m_eventList.SyncRoot)
        {
            var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
            m_eventsList.Clear();
            return events;
        }
    }
}
于 2012-06-09T10:30:57.070 に答える