utilizar net manejo logs log generar application c# .net log4net

c# - manejo - ¿Cómo registrar mensajes Trace con log4net?



manejo de logs en c# (3)

Estoy usando log4net para registrar el mensaje de registro en un archivo de registro progresivo.

Ahora también redireccionaría todos los mensajes de seguimiento de System.Diagnostics.Trace a ese archivo de registro. ¿Cómo puedo configurar eso? Traté de encontrar algo sobre eso en la documentación de log4net, pero sin éxito. ¿Es posible?

La razón por la que quiero hacer eso es porque estoy interesado en los mensajes Trace de una biblioteca de terceros.

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


No sé si log4net admite esto, pero podría implementar su propio oyente de seguimiento que lo hizo.

El TraceListener no tiene muchos métodos que necesiten implementarse y todo lo que haría sería reenviar los valores a log4net, por lo que esto debería ser fácil de hacer.

Para agregar un escucha de seguimiento personalizado, puede modificar su app.config / web.config o agregarla en el código usando Trace.Listeners.Add(new Log4NetTraceListener());


De acuerdo con la sugerencia de Rune, implementé un TraceListener básico que daba salida 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); } } }


Según las respuestas anteriores, hay una implementación aquí (este enlace es raro, pero encontré el código fuente):

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

Para abordar crudamente el problema (descrito en los comentarios de una respuesta anterior) de la emisión de rastreo log4net interno de la clase LogLog, verifiqué que esta clase era la fuente del rastreo al inspeccionar el marco de pila (que esta implementación ya hacía) y ignorando esos mensajes de seguimiento:

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

El uso de un TraceAppender seguirá creando los problemas descritos en los comentarios anteriores.