¿Cómo registrar mensajes de seguimiento con log4net?


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

Ahora también redirigiría todos los mensajes de seguimiento de System.Diagnostics.Trace a ese archivo de registro. ¿Cómo puedo configurar eso? Traté de encontrar algo al respecto 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 de rastreo 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>
Author: svick, 2009-02-05

3 answers

De acuerdo con la sugerencia de Rune, implementé un TraceListener básico que genera la 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);
        }
    }
}
 61
Author: Dirk Vollmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 15:55:31

No se si log4net soporta esto, pero usted podría implementar su propio rastreador que hizo esto.

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

Para agregar un oyente de seguimiento personalizado, debe modificar su aplicación.config / web.config o lo agregaría en código usando Trace.Listeners.Add(new Log4NetTraceListener());

 24
Author: Rune Grimstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-05 10:49:54

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

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

Para tratar crudamente el problema (descrito en los comentarios a una respuesta anterior) del seguimiento interno de log4net emitido desde la clase LogLog, comprobé que esta clase era la fuente del seguimiento inspeccionando el marco de la pila (lo que esta implementación ya hizo) e ignorando ese seguimiento mensajes:

    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.

 1
Author: Neil Dodson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 10:18:48