Frage an winforms, c#, log4net – Log4Net MemoryAppender scheint Hochgeschwindigkeitsprotokollereignisse zu verpassen

1

Ich verwende einen log4net MemoryAppender, um meine log4net-Ausgabe in einem Formulartextfeld anzuzeigen. Der relevante Teil meiner Konfigurationsdatei ist:

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

Der Code, der das Formular aktualisiert, wird von einem Zeitgeber ausgelöst und sieht folgendermaßen aus:

var events = _memoryAppender.GetEvents();

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

Es funktioniert, aber wenn meine Anwendung in kurzer Zeit viele Nachrichten protokolliert, sehe ich sie anscheinend nicht. Hat jemand eine Idee was los ist?

Als Workaround verwende ichKettensäge und ein UDP-Appender:

   <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>

Ich mag meine eigene Benutzeroberfläche jedoch besser, daher suche ich immer noch nach Antworten.

Cool. Vielen Dank. chrismead
Falls es Sie interessiert, gibt es einen Entwickler-Schnappschuss von Chainsaw mit einer Menge neuer Funktionen. Schauen Sie sich diesen hier an:people.apache.org/~sdeboy Scott

Deine Antwort

1   die antwort
3

Während Sie Ihre Protokollnachrichten in das Textfeld schreiben, werden neue Nachrichten protokolliert. Wenn Sie die Nachrichten im Appender löschen, entfernen Sie auch diese neuen Nachrichten, die nicht in das Textfeld geschrieben wurden.

Sie können die Situation verbessern, indem Sie den Appender löschen, bevor Sie mit dem Schreiben von Nachrichten in das Textfeld beginnen. Sie sollten jedoch einen eigenen Speicher-Appender erstellen und eine Methode bereitstellen, die die Nachrichten zurückgibt und das Array in einem Schritt löscht. Etwas wie das:

public class MyMemoryAppender : MemoryAppender
{
    public LoggingEvent[] GetAndClearEvents()
    {
        lock (m_eventList.SyncRoot)
        {
            var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
            m_eventsList.Clear();
            return events;
        }
    }
}
Genial. Klingt nach einem guten Rat. Ich werde es überprüfen, sobald ich wieder bei der Arbeit bin. chrismead
Ich konnte es immer noch nicht zum Laufen bringen, aber das Problem könnte durchaus an einer anderen Stelle in meinem Projekt liegen. Danke für die Idee! chrismead

Verwandte Fragen