Ich verwende log4net, um eine Protokollnachricht in eine fortlaufende Protokolldatei zu schreiben.
Jetzt würde ich auch alle Ablaufverfolgungsnachrichten von System.Diagnostics.Trace
dieser Protokolldatei umleiten . Wie kann ich das konfigurieren? Ich habe versucht, etwas darüber in der log4net-Dokumentation zu finden, aber ohne Erfolg. Ist das überhaupt möglich?
Der Grund, warum ich das tun möchte, ist, dass ich an den Trace-Nachrichten einer Bibliothek eines Drittanbieters 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>
Ich weiß nicht, ob log4net dies unterstützt, aber Sie könnten Ihren eigenen Trace-Listener implementieren, der dies getan hat.
Der TraceListener verfügt nicht über zu viele Methoden, die implementiert werden müssen. Sie müssen lediglich die Werte an log4net weiterleiten, damit dies einfach sein kann.
Um einen benutzerdefinierten Trace-Listener hinzuzufügen, ändern Sie entweder Ihre app.config / web.config oder fügen Sie sie mit Code hinzu
Trace.Listeners.Add(new Log4NetTraceListener());
quelle
Gemäß den obigen Antworten gibt es hier eine Implementierung (dieser Link ist flockig, aber ich habe den Quellcode gefunden):
https://code.google.com/archive/p/cavity/
Um das Problem (beschrieben in den Kommentaren zu einer früheren Antwort) der internen log4net-Ablaufverfolgung, die von der LogLog-Klasse ausgegeben wird, grob zu behandeln, habe ich überprüft, ob diese Klasse die Quelle der Ablaufverfolgung ist, indem ich den Stapelrahmen überprüft habe (was diese Implementierung bereits getan hat) und Ignorieren dieser Ablaufverfolgungsnachrichten:
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 */ }
Die Verwendung eines TraceAppender führt weiterhin zu den in den obigen Kommentaren beschriebenen Problemen.
quelle
Vielen Dank,
Ich ging mit Dirks Antwort etwas abgespeckter.
public class Log4netTraceListener : System.Diagnostics.TraceListener { private readonly log4net.ILog _log; public Log4netTraceListener() : this(log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)) { } public Log4netTraceListener(log4net.ILog log) { _log = log; } public override void Write(string message) => _log?.Debug(message); public override void WriteLine(string message) => _log?.Debug(message); }
quelle