Come registrare i messaggi di traccia con log4net?

Sto utilizzando log4net per registrare il messaggio di registro di scrittura in un file di registro a rotazione.

Ora redirect anche tutti i messaggi di traccia da System.Diagnostics.Trace a quel file di registro. Come posso configurarlo? Ho cercato di trovare qualcosa a riguardo nella documentazione di log4net, ma senza successo. È ansible a tutti?

La ragione per cui voglio farlo è che sono interessato ai messaggi Trace di una libreria di terze parti.

             

Secondo il suggerimento di Rune, ho implementato un TraceListener di base che invia a log4net:

 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); } } } 

Non so se log4net supporti questo, ma potresti implementare il tuo ascoltatore di tracce che ha fatto questo.

TraceListener non ha troppi metodi che devono essere implementati e tutto ciò che si farebbe è di inoltrare i valori a log4net, quindi questo dovrebbe essere facile da fare.

Per aggiungere un listener di traccia personalizzato, devi modificare app.config / web.config o aggiungerlo nel codice utilizzando Trace.Listeners.Add(new Log4NetTraceListener());

Come da risposte sopra, c’è un’implementazione qui (questo link è traballante, ma ho trovato il codice sorgente):

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

Per trattare in modo approssimativo il problema (descritto nei commenti ad una risposta precedente) di traccia interna di log4net che emette dalla class LogLog, ho verificato che questa class fosse l’origine della traccia ispezionando lo stack frame (che questa implementazione aveva già) e ignorando quei messaggi di traccia:

  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 */ } 

L’utilizzo di TraceAppender creerà comunque i problemi descritti nei commenti sopra.