log4net no funciona

123

Hola, tengo esta configuración en mi web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

pero log4net no funciona. Mi proyecto se compila bien y tampoco recibo errores de depuración. Las líneas donde le digo que log.debug("somemessage")se ejecuten bien, pero no puedo encontrar el mylog.logarchivo, entonces, ¿dónde está?

Jakob
fuente
Asegúrese de verificar esto también: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Respuestas:

298

Un problema para este tipo de cosas es asegurarse de agregar el XmlConfiguratoratributo al ensamblaje colocando la siguiente línea en su AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

De lo contrario, log4net nunca se activa.

Kirk Woll
fuente
55
Este método solía funcionar en mi proyecto, pero dejó de funcionar de alguna manera. Tuve que usar este método stackoverflow.com/a/1479343/193634 para que volviera a funcionar.
Rosdi Kasim
Lo intenté de nuevo y funciona bien. Lo más probable es que no esté haciendo referencia / cargando el ensamblado que contiene el AssemblyInfotan pronto como lo pensó.
Kirk Woll
Para aquellos que usan el apéndice ELMAH, este es el camino a seguir. Tenía 'log4net.Config.XmlConfigurator.Configure ();' en global.asax.cs y funcionaba bien para el agregado de archivos pero no para los añadidos de ELMAH.
user3885927
Marqué esta respuesta y descubrí que necesitaba ajustarla con `[ensamblado: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage,
49

Supongo que log4net no está iniciando sesión en absoluto, o el archivo no está terminando donde lo espera.

En primer lugar, ¿has llamado realmente?

XmlConfigurator.Configure()

en cualquier parte de tu código? Si el fragmento xml anterior está en el archivo de configuración de la aplicación, esta llamada hará el truco. Si el fragmento xml está en su propio archivo, deberá usar la .Configure(string)sobrecarga que toma la ruta al archivo. Sin esta llamada (o aparentemente el atributo de nivel de ensamblado mencionado por Kirk Woll), log4net no se registrará en absoluto.

Si cree que todo está hecho, y log4net debería estar registrando, entonces tal vez debería colocar una ruta completamente calificada para el archivo de registro mientras realiza la depuración. Eso le permitirá estar seguro de dónde debe estar el archivo .

Rob Levine
fuente
33

Hay otro pequeño problema, ver aquí: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

el [assembly: log4net.Config.XmlConfigurator]método no funciona con app.config. Si configura log4net desde app.config, debe usar el log4net.Config.XmlConfigurator.Configure()método

Amir Abiri
fuente
Solo para el registro, ambos métodos funcionaron para mí en una aplicación de consola.
rageit
Confirmo la solución anterior: tuve que invocar log4net.Config.XmlConfigurator.Configure (); en mi código (que usa app.config para que log4net funcione de manera efectiva. Las líneas que se imprimen efectivamente son las posteriores a la ejecución del método Configure ().
luisa rosi
19

Aquí está mi lista de verificación para cuando log4net está demostrando ser recalcitrante:

  • asegúrese de que el archivo log4net.config se copie en la carpeta bin \ al compilar (configurado en 'Copiar si es más nuevo' en el compilador)
    • al tratar con el código instalado, asegúrese de que log4net.config vino para el viaje (establecido en 'Contenido' en el compilador)
  • asegúrese de que el usuario que ejecuta el proceso tenga derechos de escritura en la carpeta donde se escribirán los registros
  • en caso de duda, otorgue permisos promiscuos a c: \ temp \ y obtenga todo para iniciar sesión allí ()
  • inicie Sysinternal / Dbgview.exe para ver si eso le dice algo
earthling42
fuente
3
"asegúrese de que el archivo log4net.config se copie en la carpeta bin \ al compilar (configurado en 'Copiar si es más nuevo' en el compilador)" -> save my day! ¡Muchísimas gracias!
Hoang Nguyen Huu
8

Para un proyecto ASP.NET MVC agregando

log4net.Config.XmlConfigurator.Configure();

a Global.asax.cs también ayuda a:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}
Oladipo Olasemo
fuente
1
Tuve un problema muy extraño con esto, en la producción y en la computadora de mi jefe, los registradores funcionaron bien así, pero hasta que la respuesta de Kirk no funcionó en mi computadora. Solo pensé en avisarle a la gente en caso de que tengan problemas similares (proyecto MVC por cierto).
Shelby115
@ Shelby115, muchas gracias! Estaba tratando de poner mis entradas log4Net en ELMAH. Tenía todo correcto en web.config. Ya tenía 'log4net.Config.XmlConfigurator.Configure ();' en mi global.asax.cs pero no funciona. Llegó a esta publicación SO y agregó la línea a assemblyInfo.cs según Kirk's. ¡Todavía no funcionó! Después de leer su comentario, eliminé la entrada anterior de global.asax.cs y comenzó a funcionar. Pasé varias horas en esto y tu comentario fue de gran ayuda. ¡Gracias de nuevo!
user3885927
La entrada en global.asax.cs funcionaba bien para el agregado de archivos, pero no para los añadidos de ELMAH. La forma de Kirk funcionó para el apéndice de ELMAH (específicamente tuve que eliminarlo de global.asax.cs)
user3885927
También es posible que desee asegurarse de que log4net tenga permisos de escritura en el directorio configurado para los archivos de registro.
Oladipo Olasemo
@ Shelby115 Dang, me encantará cuando olvides la solución y tu propio comentario resuelva tu problema. Llegar a una página con una respuesta ya votada por usted también es un buen indicador.
Shelby115
7

Estos son los pasos que finalmente hicieron que mi registro de archivos funcionara:

  • -Check AssemblyInfo.cs contiene el siguiente atributo. [ensamblaje: log4net.Config.XmlConfigurator] . Esto carga log4net.
  • Verifique que el directorio de registro tenga permisos de escritura.
  • Verifique que el registrador tenga un formato especificado. Esto se hace comprobando que cada elemento en su configuración tiene un elemento de diseño especificado. P.ej:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Finalmente, intente activar el registro interno de log4net para habilitar el registro de la consola y verificar la consola. Para hacer esto, agregue <add key="log4net.Internal.Debug" value="true"/>a su appSettings.
Echilon
fuente
<add key = "log4net.Internal.Debug" value = "true" /> Esto me ayudó a solucionar el problema. Gracias
Ravi Khambhati
Los permisos del directorio es lo que me
atrapó
6

He tenido experiencias en las que los sistemas de registro fallan silenciosamente sin generar excepciones. Supongo que esto tiene sentido porque si el registrador está registrando errores, ¿cómo puede registrar un error que no puede realizar el registro?

Entonces, si el archivo no se crea en el disco, comience buscando en los permisos del sistema de archivos para asegurarse de que el usuario con el que se ejecuta su aplicación pueda escribir un nuevo archivo en esa ubicación del disco.

Para fines de prueba, es posible que desee crear manualmente el archivo en el disco en el que se debe escribir y abrir permisos para que todos puedan escribir en él. Si el registrador comienza a escribir en él, entonces sabe que está basado en permisos en lugar de en la configuración.

John K
fuente
2

Por mi parte, olvidé marcar el archivo de configuración que se copiará mientras se compila la aplicación.

Copie el archivo de configuración al directorio de salida

Simplemente haga clic derecho en el archivo log4net.config, seleccione la propiedad y luego elija Copiar al directorio de salida para que sea Copiar XXXX

Võ Quang Hòa
fuente
1

Intenté todo lo anterior pero nada funcionó. Agregar esta línea en la configSections sección de app.config funcionó para mí.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Asegúrese de que Versiony PublicKeyTokensea ​​correcto

Reyan Chougle
fuente
0
<param name="File" value="mylog.log" />

está diciendo "escriba mylog.log en la carpeta real". Esto significa que si su aplicación web está bajo IIS, el registro se escribirá en C: \ inetpub \ wwwroot \ appname \ mylog.log.

Si el archivo de registro no está allí, entonces tal vez la cuenta bajo la cual se está ejecutando la aplicación no tiene permiso de escritura en la carpeta. Puede ejecutar Process Monitor desde SysInternals para ver si se escribe un archivo y dónde.

También ejecute VS en modo de depuración, para ver si se lanzan excepciones (Depuración-> Excepciones-> Excepciones CLR, marque Lanzado).

Tomás Voracek
fuente
0

En mi caso, olvidé establecer las propiedades del archivo log4Net.config como "Contenido" para que el archivo no se incluyera en la implementación. Así que presta atención:

Compile action : Content
Marco
fuente
0

Lamentablemente, ninguno de los anteriores ayudó. La configuración explícita en la clase que se registrará adicionalmente a las sugerencias de configuración anteriores hizo el truco para mí.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
Petro Slyvko
fuente
-7

Además, después de algunas horas, descubrí por qué no funcionaba para mí ...

yo tenía:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

pero debería ser:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Así que asegúrese de que el ILog esté en la primera línea ...

Jeroen Bakker
fuente
1
Esta definitivamente no es la causa. No importa cuándo inicializa el objeto ILog siempre que lo haga antes de realizar una llamada a los métodos de registro, es decir, _log.Info; _log.error etc.
Oladipo Olasemo