Pregunta

Tengo algunos problemas para que log4net funcione desde ASP.NET 3.5. Esta es la primera vez que trato de usar log4net, siento que me falta una pieza del rompecabezas.

Mi proyecto hace referencia al ensamblaje log4net y, por lo que sé, se está implementando correctamente en mi servidor.

Mi web.config contiene lo siguiente:

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

  <log4net>
    <appender name="InfoAppender" type="log4net.Appender.FileAppender">
      <file value="..\..\logs\\InfoLog.html" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
          value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <logger name="_Default">
      <level value="INFO" />
      <appender-ref ref="InfoAppender" />
    </logger>
  </log4net>

Estoy usando el siguiente código para probar el registrador:

using log4net;
using log4net.Config;

public partial class _Default : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("_Default");

    protected void Page_Load(object sender, EventArgs e)
    {
        log.Info("Hello logging world!");
    }
}

En mi Global.asax, estoy haciendo lo siguiente:

void Application_Start(object sender, EventArgs e) 
{
    log4net.Config.XmlConfigurator.Configure();
}

En este punto, no puedo pensar en qué otra cosa podría estar haciendo mal. El directorio en el que estoy tratando de almacenar el inicio de sesión se puede escribir, e incluso si pruebo directorios diferentes, obtengo el mismo resultado: no hay archivo, no hay registros.

¿Alguna sugerencia? :-)


Editar: probé varios formatos diferentes para la ruta & amp; nombre del archivo de registro, algunos de los cuales incluyen " .. \ .. \ InfoLog.html " ;, " InfoLog.html " ;, " logs \ InfoLog.html " ;, etc, en caso de que alguien se esté preguntando si ese es el problema.


Editar: He agregado el nodo del registrador raíz nuevamente en la sección log4net, omití eso en un accidente al copiar de las muestras. El nodo del registrador raíz se ve así:

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

Sin embargo, incluso con esto, todavía no estoy teniendo suerte.

¿Fue útil?

Solución

El registrador raíz es obligatorio, creo. Sospecho que la configuración está fallando porque la raíz no existe.

Otro problema potencial es que Configure no está siendo apuntado al Web.config.

Intente Configurar (Server.MapPath (" ~ / web.config ")) en su lugar.

Otros consejos

Suena muy parecido a un problema de permisos de archivos para mí. Si especifica un nombre de archivo sin ninguna ruta, log4net escribirá en el directorio raíz de la aplicación web. Trata eso. Salvo que tenga éxito, le recomiendo que habilite la depuración interna de log4net colocando lo siguiente en su web.config:

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

Luego, implemente la aplicación compilada en modo de depuración y ejecute depurador remoto de estudio visual para ver cualquier error que se genere.

Iv acaba de pasar 3 horas tratando de solucionar este problema, al final fue el formato web.config.

Tuve esto, y no funcionó:

<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
      <section name="log4net"
        type="log4net.Config.Log4NetConfigurationSectionHandler
      , log4net"
        requirePermission="false"/>

cambiándolo a esto lo arreglé:

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

¡Molesto!

Solo para información: la ruta del archivo debe tener el formato siguiente:

<file value="..\\..\\logs\\InfoLog.html" />

Un sencillo tutorial de configuración de CodeProject

No tengo Global.asx para ejecutar en .net 3.5

este es mi código ... configuro log4net en un archivo separado log4net.config

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

//My Web Services class name
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Service1");

Tuve el mismo problema (frustrante) Moví la raíz a la parte superior de la sección de configuración de log4net y todo funcionó. Además, yo también tenía un elemento raíz y un registrador, esto resultó en dos líneas cada vez que hice una llamada al registrador. Quité el elemento logger y simplemente mantengo la raíz y su funcionamiento excelente.

¿Qué hay de crear el registrador con el tipo de página, como esto?

private static readonly ILog log = LogManager.GetLogger(typeof(_Default));

Esto es lo que tengo en Global.ASX. Lo tengo todo trabajando en asp.net 3.5

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
         log4net.Config.XmlConfigurator.Configure(); 
    }

    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown
        log4net.LogManager.Shutdown();
    }

    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs
    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started
    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.
    }
</script>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top