2009-02-05 12 views
60

Ich benutze log4net, um eine Protokolldatei in eine laufende Protokolldatei zu schreiben.Wie protokolliert man Trace-Nachrichten mit log4net?

Jetzt würde ich auch alle Trace-Nachrichten von System.Diagnostics.Trace in diese Protokolldatei umleiten. Wie kann ich das konfigurieren? Ich habe versucht, etwas darüber in der log4net-Dokumentation zu finden, aber ohne Erfolg. Ist es überhaupt möglich?

Der Grund, warum ich das tun möchte, ist, weil ich an den Trace-Nachrichten einer 3rd-Party-Bibliothek interessiert bin.

<log4net> 
    <appender name="R1" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\Logs\MyService.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <maxSizeRollBackups value="10" /> 
     <datePattern value="yyyyMMdd" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
</log4net> 

Antwort

58

Nach Rune Vorschlag umgesetzt ich einen grundlegenden Tracelistener, die Ausgabe zu log4net

Um ein benutzerdefinierten Trace-Listener Sie würden entweder ändern Sie Ihr app.config/web.config hinzufügen, oder würden Sie es in Code hinzu:

public class Log4netTraceListener : System.Diagnostics.TraceListener 
{ 
    private readonly log4net.ILog _log; 

    public Log4netTraceListener() 
    { 
     _log = log4net.LogManager.GetLogger("System.Diagnostics.Redirection"); 
    } 

    public Log4netTraceListener(log4net.ILog log) 
    { 
     _log = log; 
    } 

    public override void Write(string message) 
    { 
     if (_log != null) 
     { 
      _log.Debug(message); 
     } 
    } 

    public override void WriteLine(string message) 
    { 
     if (_log != null) 
     { 
      _log.Debug(message); 
     } 
    } 
} 
+9

+1 für die Antwort oben. Ich würde vorsichtig sein, wenn log4net auch eingerichtet ist, um auf einen TraceAppender zu schreiben. Ich habe das nicht wirklich getestet, aber Sie könnten in einer Situation enden, in der Trace in log4net schreibt und log4net in Trace schreibt, was zu einer Endlosschleife führt. Im obigen Beispiel könnten Sie dies mildern, indem Sie den TraceAppender in den Appendern für den Logger 'System.Diagnostics.Redirection' nicht einschließen. – Jimit

+0

Da dies ein Trace-Listener ist, sollten Sie try/catch-Blöcke in den Write-Methoden implementieren, um sicherzustellen, dass ein Schreibversuch den Host niemals fehlschlägt. Ich habe Codeänderungen eingereicht, die die Konstruktion von Objekten korrigieren und den Code lesbarer machen und weniger wahrscheinlich ausfallen. –

+0

@JYL Hier ist [ein aktualisierter Link zu diesem Blogpost] (http://www.geertvanhorrik.com/2010/06/18/log4net-tracelistener/). Es sieht jedoch so aus, als hätten sich einige Dinge im Zug verloren. Der XML-Code in diesem Post ist jetzt falsch und die Verbindung zum Log4netTraceListener funktioniert nicht. Hoffentlich wird der Autor den Code wiederbeleben. –

23

Ich weiß nicht, ob log4net dies unterstützt, aber Sie könnten Ihren eigenen Trace-Listener implementieren, der dies getan hat.

Der TraceListener hat nicht zu viele Methoden, die implementiert werden müssen, und alles, was Sie tun würden, ist, die Werte an log4net weiterzuleiten, so dass dies leicht zu tun sein sollte. mit Trace.Listeners.Add(new Log4NetTraceListener());

1

sich nach den Antworten oben, gibt es eine Implementierung hier (dieser Link ist flockig, aber ich habe den Quellcode finden):

https://code.google.com/archive/p/cavity/

Um das Problem (beschrieben in den Kommentaren zu einer vorherigen Antwort) der internen log4net-Ablaufverfolgung aus der LogLog-Klasse grob zu behandeln, habe ich überprüft, dass diese Klasse die Quelle der Ablaufverfolgung durch die Überprüfung des Stack-Frame ist bereits) und ignorieren diese Trace-Nachrichten:

public override void WriteLine(object o, string category) 
    { 
     // hack to prevent log4nets own diagnostic trace getting fed back 
     var method = GetTracingStackFrame(new StackTrace()).GetMethod(); 
     var declaringType = method.DeclaringType; 
     if (declaringType == typeof(LogLog)) 
     { 
      return; 
     } 
     /* rest of method writes to log4net */ 
    } 

ein TraceAppender mit noch die Probleme in den Kommentaren oben beschrieben erstellen.

Verwandte Themen