Cómo rastrear problemas de log4net

191

Uso log4net todo el tiempo, pero una cosa que nunca he descubierto es cómo saber qué está sucediendo en el interior. Por ejemplo, tengo un apéndice de consola y un apéndice de base de datos en mi proyecto. Hice algunos cambios en la base de datos y el código, y ahora el apéndice de la base de datos ya no funciona. Descubriré por qué eventualmente, pero ayudaría mucho si pudiera ver lo que está sucediendo dentro de log4net.

¿Log4net genera algún tipo de salida que pueda ver para tratar de determinar el origen de mi problema?

John M Gant
fuente

Respuestas:

293

Primero debe establecer este valor en el archivo de configuración de la aplicación:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Luego, para determinar el archivo en el que desea guardar la salida, puede agregar el siguiente código en el mismo archivo .config:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

Puede encontrar una explicación más detallada en "¿Cómo habilito la depuración interna de log4net?" en la página de preguntas frecuentes de log4net .

David Espart
fuente
10
Solo asegúrese de que el proceso en el que se ejecuta su aplicación tenga derechos sobre la ruta donde desea crear su archivo de texto de registro ("C: \ tmp \ log4net.txt" en el ejemplo anterior)
NMrt
3
Parece que la depuración interna no tiene marcas de tiempo
snit80
44
Cambié de C:\tmp\log4net.txta C:\log4net.txt, luego puede generar un archivo de texto.
Frank Myat jue
66
Solo una nota que encontré de manera divertida. Asegúrese de que <configSections></configSections>sea ​​la primera entrada debajo <configuration>. De lo contrario, terminas con un error.
Nick
2
Esto no muestra el tiempo para las entradas en el archivo de registro. Intenté establecer atributos traceOutputOptions="TimeStamp"y traceOutputOptions="DateTime"en la addetiqueta, pero no cambia nada en el contenido del archivo de registro. ¿Alguien sabe cómo configurar log4net para mostrar la hora de cada línea / entrada en el archivo de registro de seguimiento?
Ulises Alves
43

Si está utilizando un archivo de configuración de log4net, también puede activar la depuración allí cambiando el nodo superior a:

<log4net debug="true">

Esto funcionará una vez que la configuración se vuelva a cargar y suponiendo que su escucha de seguimiento esté configurada correctamente.

Bolo
fuente
66
Una vez que este indicador esté habilitado, podrá ver los registros de diagnóstico de log4net dentro de la ventana de Salida de Visual Studio
Naren
24

Además de la respuesta anterior, puede usar esta línea para ver el registro en tiempo real en lugar de la salida c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Por ejemplo, en una aplicación de consola, puede agregar esto y luego ver la salida en tiempo real. Es bueno para depurar log4net en un pequeño arnés de prueba para ver qué sucede con el apéndice que está probando.

JP Toto
fuente
8

Asegúrese de que la aplicación raíz donde está su punto de entrada registre algo en log4net. Dale uno de estos:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

Con 2.0.8, tuve una situación interesante. Creé un proyecto de biblioteca y un proyecto exe de prueba que demostraría sus capacidades. El proyecto de la biblioteca se configuró para usar Log4net como era el proyecto exe. El proyecto exe usó el atributo de información de ensamblaje para registrar la configuración, sin embargo, no estaba obteniendo resultados de registro ni en la consola ni en el archivo de registro. Cuando encendí el registro de depuración interna de log4net, recibí algunos mensajes internos escritos en la consola, pero todavía ninguno de mis registros normales. No se informaron errores. Todo comenzó a funcionar cuando agregué el código anterior a mi programa. Log4net fue configurado de otra manera correctamente.

K0D4
fuente
1
salvó el mío también :-)
costa
2

Si el registro interno no le brinda suficiente información, es muy fácil construir y depurar el código fuente . Si no desea mezclar esto con su proyecto de desarrollo, agregue una aplicación de consola simple que solo registre un mensaje, copie su proyecto log4net.configen esta aplicación y depure la clase en cuestión.

StuartN
fuente
2

En log4net 2.0.8 parece que no es posible realizar el registro con log4net en una DLL separada. Si probé esto, los resultados son muy extraños: ya no se realiza ningún registro. Y la inicialización de log4net con la opción de depuración no muestra errores.

Como dijo K0D4, debe tener una referencia a log4net en su módulo principal y debe llamar una vez al inicio del Programa y todo está bien.

En la próxima versión de log4net, este error probablemente se solucionará.

olaf870
fuente