Log4net no escribe el registro en el archivo de registro


159

He creado un escenario simple usando Log4net, pero parece que mis apéndices de registro no funcionan porque los mensajes no se agregan al archivo de registro.

Agregué lo siguiente al archivo web.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Dentro del archivo global ASAX que he agregado:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

Y dentro del método Application_Start:

logger.Info("Starting the application...");

¿Por qué el registro de prueba "Iniciando la aplicación ..." no se agrega al archivo de registro?

Respuestas:


316

Llamas

log4net.Config.XmlConfigurator.Configure();

¿Dónde hacer que log4net lea su configuración? Por ejemplo, en Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

44
Muchas gracias, eso es todo, tuve la siguiente línea: log4net.Config.BasicConfigurator.Configure (); ¿Llamo a esto si uso la configuración de c # en lugar de web.config para configurar log4net? ¿Se requiere esta llamada al método "Configurar" de alguna manera porque en muchos tutoriales no encontré esta línea de código?
john84

9
Existen numerosas formas de decirle a log4net dónde buscar la configuración, consulte logging.apache.org/log4net/release/manual/configuration.html . Llamar a XmlConfigurator.Configure () hará que log4net busque la configuración en <app.exe> ​​.config o web.config. BasicConfigurator.Configure (según los documentos del SDK): "Inicializa el sistema de registro log4net utilizando un ConsoleAppender que escribirá en Console.Out".
Andreas Paulsson

FYI: también puede usar log4net.Config.BasicConfigurator si NO desea que esté basado en un archivo. La salida se envía a la consola.
silverArc

1
Estoy haciendo la configuración en el AssemblyInfoarchivo. Publicado como respuesta a continuación.
LCJ

Argh, encontró tantas de estas preguntas y en todas partes no mencionan dónde encontrar los archivos de registro reales ... ¿Es tan obvio que todos ya lo saben?
MrFox

50

Utilice esta página de preguntas frecuentes: Preguntas frecuentes de Apache log4net

Aproximadamente 3/4 del camino hacia abajo le indica cómo habilitar la depuración de log4net mediante el seguimiento de aplicaciones. Esto le dirá dónde está su problema.

Los fundamentos son:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Y ves el rastro en la salida estándar


1
Gracias. Revisé las preguntas frecuentes, pero no pudieron resolver mi problema.
john84

1
¡Gracias a esta respuesta pude identificar que mi rootsección se refería al registrador incorrecto!
seebiscuit

Gran consejo. Descubrí que el acceso al usuario de asp.net fue denegado
Blue Clouds

si no le funciona a alguien, intente utilizar esto: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
himanshupareek66

35

Como @AndreasPaulsson sugirió, tenemos que configurarlo. Estoy haciendo la configuración en el AssemblyInfoarchivo. Especifico el configuration file nameaquí.

// Log4Net Configuration.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

9
¿Qué sucede si tengo esto y log4net.Config.XmlConfigurator.Configure (); en carga?
n00b

1
@ n00b, entonces podemos comentar esta línea, en realidad solo de esta manera me funcionó "log4net.Config.XmlConfigurator.Configure ();", y una cosa más: también agregué esto en mi configuración web.config <add key = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Además, asegúrese de que la opción "Copiar siempre" esté seleccionada para [log4net] .config

ingrese la descripción de la imagen aquí


1
Esta fue la solución para mí. Siempre olvido esta configuración.
Ju66ernaut

25

Asegúrese de que el proceso (cuenta) en el que se ejecuta el sitio tenga privilegios para escribir en el directorio de salida.

En IIS 7 y superior, esto se configura en el grupo de aplicaciones y normalmente es la identidad del grupo de aplicaciones , que normalmente no tendrá permiso para escribir en todos los directorios.

Verifique sus registros de eventos (aplicación y seguridad) para ver si se produjeron excepciones.


Gracias por su ayuda, también pensé en problemas de permisos, pero también si configuro en la carpeta leer, escribir, modificar y ejecutar permisos para todos, no funciona.
john84

@ john84: ¿está recibiendo excepciones? ¿Has mirado los registros de eventos?
Oded

También es importante, como acabo de descubrir, que un servicio de Windows se ejecute con una cuenta específica.
Bob Mc

Muchas gracias que me ayudaron mucho.
Abbas

20

Insertar:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

al final del archivo AssemblyInfo.cs


Este fue mi rescate. Hacer un proyecto de formularios de escritorio y colocar log4net.Config.XmlConfigurator.Configure (); en general no estaba ayudando. Gracias
Tomas Hesse

Esto me ayudó. Tenía la configuración en web.config pero log4net parecía no captar los cambios realizados. Agregué "Watch = true" a ese atributo y las cosas comenzaron a funcionar
aunque el

3

Para mí, cambié la ubicación de los archivos de registro y solo cuando cambié el nombre del archivo a otra cosa, comenzó de nuevo.

Parece que si ya existe un archivo de registro con el mismo nombre, no pasa nada.

Luego renombro el archivo viejo y cambié el nombre del archivo de registro en la configuración nuevamente a lo que era.


2

En mi caso, log4net no estaba registrando correctamente debido a que tenía un espacio en el nombre de mi proyecto. Me volvió loco por qué el mismo código funcionó bien en un proyecto diferente, pero no lo hizo en el nuevo. Espacios Un espacio simple

Entonces, tenga cuidado con los espacios en los nombres de los proyectos. He aprendido mi leccion.


1
¿Dónde tuviste este problema? Log4Net funciona muy bien en un proyecto, pero no en otro ... no sé por qué. Tks
Pascal

2

En mi caso, tuve que dar el IIS_IUSRSpermiso de lectura / escritura al archivo de registro.


1

Asegúrese de que el siguiente código de línea debe estar allí en el archivo AssemblyInfo.cs.

[ensamblaje: log4net.Config.XmlConfigurator (ConfigFile = "Web.config", Watch = true)]

y también verifique esta línea en el método Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Su archivo de configuración parece correcto. Luego, debe registrar su archivo de configuración Log4net en la aplicación. Entonces puedes usar el siguiente código:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Después de registrar el proceso, puede llamar a la siguiente definición para llamar al registrador:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

Para mí tuve que mover Logger a un paquete Nuget. El siguiente código debe agregarse en el proyecto del paquete NuGet.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Ver https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ para más detalles.


Intenta evitar los enlaces como respuestas. Puede que no siempre funcionen. Quizás edite su respuesta para incluir un resumen de la información en el enlace.
Derek C.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.