Domanda

Ho dei problemi a far funzionare log4net da ASP.NET 3.5. Questa è la prima volta che provo ad usare log4net, mi sento come se mi mancasse un pezzo del puzzle.

Il mio progetto fa riferimento all'assembly log4net e, per quanto ne so, viene distribuito correttamente sul mio server.

Il mio web.config contiene quanto segue:

  <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>

Sto usando il seguente codice per testare il logger:

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!");
    }
}

Nel mio Global.asax, sto facendo quanto segue:

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

A questo punto, non riesco a pensare a cos'altro potrei fare di sbagliato. La directory in cui sto tentando di archiviare il login è scrivibile e anche se provo directory diverse ottengo lo stesso risultato: nessun file, nessun registro.

Qualche suggerimento? : -)


Modifica: ho provato diversi formati per il percorso & amp; nome del file di registro, alcuni dei quali includono " .. \ .. \ InfoLog.html " ;, " InfoLog.html " ;, " logs \ InfoLog.html " ;, ecc., nel caso in cui qualcuno si stia chiedendo se questo è il problema.


Modifica: ho aggiunto di nuovo il nodo del logger di root nella sezione log4net, l'ho lasciato per errore durante la copia dai campioni. Il nodo del logger principale è simile al seguente:

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

Anche con esso, tuttavia, non ho ancora fortuna.

È stato utile?

Soluzione

Penso che il logger di root sia obbligatorio. Sospetto che la configurazione non riesca perché il root non esiste.

Un altro potenziale problema è che Configure non viene indirizzato a Web.config.

Prova invece a configurare (Server.MapPath (" ~ / web.config ")).

Altri suggerimenti

Mi sembra molto un problema con le autorizzazioni dei file. Se si specifica un nome file senza alcun percorso, log4net scriverà nella directory principale dell'applicazione Web. Prova questo. Tranne il successo lì, ti consiglio di abilitare il debug log4net interno inserendo quanto segue nel tuo web.config:

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

Quindi, distribuisci l'app compilata in modalità debug ed esegui debugger remoto di Visual Studio per vedere eventuali errori generati.

Iv ha appena trascorso 3 ore a cercare di risolvere questo problema, alla fine è stata la formattazione web.config.

L'ho avuto e non ha funzionato:

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

cambiandolo in questo risolto:

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

Annoying !!

Solo per informazioni: il percorso del file deve essere formattato come segue:

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

Un semplice tutorial di configurazione da CodeProject

Non ho Global.asx per funzionare in .net 3.5

questo è il mio codice ... Configuro log4net in un file separato 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");

Ho avuto lo stesso problema (frustrante). ho spostato il root nella parte superiore della sezione di configurazione di log4net e tutto ha funzionato. Inoltre, anch'io avevo root e un elemento logger, questo portava a due linee ogni volta che facevo una chiamata al logger. ho rimosso l'elemento logger e ho semplicemente mantenuto il root e il suo funzionamento eccezionali.

Che ne dici di creare il logger con il tipo di pagina, in questo modo:

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

Questo è quello che ho in Global.ASX. Ha funzionato tutto in 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top