2016-09-26 3 views
0

ich log4net api in meiner WinForms-Anwendung für die Anmeldung verwenden. Ich habe mehrere Appender: RollingFileAppender und TextBoxAppender (benutzerdefinierte Appender).log4net Log-Meldungen nur auf ein paar Appen

Ich möchte ein paar Fehlermeldungen nur in der Protokolldatei (RollingFileAppender) und nicht auf das Textfeld (TextBoxAppender), und einige andere Nachrichten an loggt sein. Wie kann ich es erreichen? Beachten Sie, dass die Nachrichten die gleiche Ebene haben, d. H. Alle ERROR-Nachrichten.

Danke.

EDIT 1:

Insbesondere möchte ich in der Protokolldatei nur einfach eine Zeile Fehlermeldungen in der Benutzeroberfläche sowie Protokolldatei, aber stacktraces anzuzeigen.

+1

Obwohl Sie * kann * tun dies mit nur einem Logger (durch geeignete Anwendung von f Filter) Dies geht gegen den Strich von log4net. Was Sie in der Regel tun mögen, ist getrennten Logger für jede Konfiguration verwenden und fügen Sie Appen zu diesen Loggern gegebenenfalls ('FileLogger',' UILogger', 'UniversalLogger', so ähnlich). Beachten Sie, dass Protokollierer Appender freigeben können. Auch –

+0

wenn ich getrennte Logger verwenden war, wie kann ich die Nachrichten von der gleichen Ebene filtern, zB einige Meldungen von Protokollebene ERROR werden im UILogger gezeigt, und einige Nachrichten von derselben Protokollebene ERROR, gezeigt werden NICHT. Im Grunde, was Sie vorschlagen, ist, dass jeder Ort ich die beiden Logger wie erforderlich aufrufen müssen, wie logger1.Error() und logger2.Error() – AllSolutions

+0

Die Verwendung von mehreren Logger-Instanzen kann in Ordnung sein, wo ich senden möchte Die Log-Nachricht nur an 1 Ziel, aber die Mehrheit der Fälle erfordern Nachrichten an beide Logger gesendet werden – AllSolutions

Antwort

2

Wie ich es verstehe, möchten Sie eigentlich Nachrichten an beide Appender gehen, aber nur eine von ihnen Protokollstack Spuren haben. Zuerst Protokollmeldungen einschließlich Ausnahme als Ausnahme, nicht verwenden Exception.ToString():

logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex); 

Dann können Sie Ihre Logger mehr Appen verwenden, den Stack-Trace von denen einige weglassen von log4net erzählen wir die Betreuung von Ausnahmen (von tatsächlich mit ihnen nichts zu tun):

<appender name="TextBoxAppender" type="MyAppenders.TextBoxAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <ignoresException value="false" /> 
     <conversionPattern value="%m%n" /> 
    </layout> 
</appender> 

Und andere mit allen Details:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{ISO8601} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

Für den TextBoxAppender, habe ich ignoresException auf true gesetzt, und ich habe den Code geändert in: logger.Error ("Stack Trace:", ex) ;. Immer noch zeigt das Textfeld den Stack Trace an. Was habe ich verpasst? Mein Conversion-Muster ist: AllSolutions

+0

Whoops, ich bin verwirrt. 'ignoresException' sollte' false' sein, um anzuzeigen, dass das Layout * die Ausnahme behandelt - indem es nicht gedruckt wird. –

+0

Ok Ja :) Wenn ich es auf false setze, kann ich den Stack Trace in der Benutzeroberfläche unterdrücken. Aber da mein Code ist: logger.Error ("Stack Trace:", ex); Die Benutzeroberfläche zeigt die Wörter "Stack Trace" an. Was soll ich im 1. Parameter weitergeben, wenn ich nicht möchte, dass auf der Benutzeroberfläche etwas angezeigt wird? – AllSolutions

1

Die Lösung zur Ausgabe von verschiedenen Nachrichten an verschiedenem Appen soll die ForwardingAppender sein (die Dokumentation über logging.apache unten in der Gegenwart zu sein scheint, aber trotzdem hier ist der Link: https://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html)

Hier können Sie Basierter Filter auf Loglevel (die meisten Beispiele), aber auch basierend auf Log-Nachrichten (siehe hier: http://www.codeproject.com/Articles/140911/log-net-Tutorial, Paragraph "StringMatchFilter")

Zumindest hilft Ihnen das, nur diese eine Nachricht an einen bestimmten Appender zu bringen. Um sicherzustellen, wie Sie den Stacktrace weglassen, siehe Jeroen Mosterts Antwort

Verwandte Themen