Log4net non scrive il registro nel file di registro


159

Ho creato uno scenario semplice utilizzando Log4net, ma sembra che le mie appendici di registro non funzionino perché i messaggi non vengono aggiunti al file di registro.

Ho aggiunto quanto segue al file 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>

All'interno del file ASAX globale ho aggiunto:

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

E all'interno del metodo Application_Start:

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

Perché il registro di prova "Avvio dell'applicazione ..." non viene aggiunto al file di registro?

Risposte:


316

Chiami

log4net.Config.XmlConfigurator.Configure();

da qualche parte per fare in modo che log4net legga la tua configurazione? Ad esempio in Global.asax:

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

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

4
Grazie mille, ecco la riga seguente: log4net.Config.BasicConfigurator.Configure (); Lo chiamo se utilizzo la configurazione c # anziché web.config per configurare log4net? È questa chiamata "Configura" -Metodo in qualche modo richiesta perché in molti tutorial non ho trovato questa riga di codice.
john84,

9
Esistono numerosi modi per indicare a log4net dove cercare la configurazione, vedere logging.apache.org/log4net/release/manual/configuration.html . Se si chiama XmlConfigurator.Configure (), log4net cercherà la configurazione in <app.exe> ​​.config o web.config. BasicConfigurator.Configure sarà (secondo i documenti SDK): "Inizializza il sistema di registrazione log4net utilizzando un ConsoleAppender che scriverà su Console.Out."
Andreas Paulsson,

Cordiali saluti - è anche possibile utilizzare log4net.Config.BasicConfigurator se NON lo si desidera basato su file. L'output viene inviato alla console.
silverArc

1
Sto eseguendo la configurazione nel AssemblyInfofile. Inserito come risposta di seguito.
LCJ

Argh, ho trovato così tante di queste domande e ovunque non riescono a menzionare dove trovare i file di registro effettivi ... È così ovvio che già tutti lo sanno?
MrFox,

50

Usa questa pagina FAQ: Domande frequenti su Apache log4net

A circa 3/4 della discesa, viene spiegato come abilitare il debug di log4net utilizzando la traccia dell'applicazione. Questo ti dirà dov'è il tuo problema.

Le basi sono:

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

E vedi la traccia nell'output standard


1
Grazie ho controllato le FAQ ma queste non sono state in grado di risolvere il mio problema.
john84,

1
Grazie a questa risposta sono stato in grado di identificare che la mia rootsezione si riferiva al logger sbagliato !!
SeeBiscuit

ottimo consiglio. Ho scoperto che l'accesso è stato negato per l'utente asp.net
Blue Clouds

se non funziona con qualcuno, prova a usare questo: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
himanshupareek66

35

Come suggerito da @AndreasPaulsson, dobbiamo configurarlo. Sto eseguendo la configurazione nel AssemblyInfofile. Specifico configuration file namequi.

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

9
cosa succede se ho sia questo che log4net.Config.XmlConfigurator.Configure (); sotto carico?
n00b

1
@ n00b, quindi possiamo commentare questa riga, in realtà solo in questo modo ha funzionato con me "log4net.Config.XmlConfigurator.Configure ();", E un'altra cosa: l'ho aggiunto anche nelle mie impostazioni web.config <aggiungi chiave = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Inoltre, assicurarsi che l' opzione "Copia sempre" sia selezionata per [log4net] .config

inserisci qui la descrizione dell'immagine


1
Questa è stata la soluzione per me. Dimentico sempre questa impostazione.
Ju66ernaut,

25

Assicurarsi che il processo (account) in cui è in esecuzione il sito disponga dei privilegi per scrivere nella directory di output.

In IIS 7 e versioni successive questo è configurato nel pool di applicazioni ed è normalmente Identity AppPool , che normalmente non disporrà dell'autorizzazione per scrivere in tutte le directory.

Controlla i log degli eventi (applicazione e sicurezza) per vedere se sono state generate eccezioni.


Grazie per l'aiuto, ho pensato anche ai problemi di autorizzazione, ma anche se ho impostato nella cartella leggere, scrivere, modificare ed eseguire le autorizzazioni per tutti, non funziona.
john84,

@ john84 - stai ricevendo eccezioni? Hai guardato i registri degli eventi?
Oded,

Anche importante, come ho appena scoperto, con un servizio Windows in esecuzione con un account specifico.
Bob Mc

Grazie mille che mi ha aiutato molto.
Abbas,

20

Inserire:

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

alla fine del file AssemblyInfo.cs


Questo è stato il mio salvataggio. Realizzare un progetto di moduli desktop e inserire log4net.Config.XmlConfigurator.Configure (); in linea di massima non stava aiutando. Grazie
Tomas Hesse il

questo mi ha aiutato. Avevo la configurazione in web.config ma log4net sembrava non rilevare le modifiche apportate. Ho aggiunto "Watch = true" per l'attributo e anithing ha iniziato a lavorare
albe

3

Per me ho spostato la posizione dei file di log ed è stato solo quando ho cambiato il nome del file in qualcos'altro che è ricominciato.

Sembra che se esiste già un file di registro con lo stesso nome, non accade nulla.

Successivamente ho rinominato il vecchio file e ho cambiato di nuovo il nome del file di registro nella configurazione in quello che era.


2

Nel mio caso, log4net non registrava correttamente a causa di uno spazio nel nome del mio progetto. Mi ha fatto impazzire il motivo per cui lo stesso codice ha funzionato bene in un progetto diverso, ma non nel nuovo. Spazi. Uno spazio semplice

Quindi, attenzione agli spazi nei nomi dei progetti. Ho imparato la mia lezione.


1
Dove hai avuto questo problema? Log4Net funziona alla grande in un progetto, ma non in un altro ... non so perché. Tks
Pascal,

2

Nel mio caso ho dovuto dare l' IIS_IUSRSautorizzazione di lettura / scrittura al file di registro.


1

Assicurarsi che il seguente codice riga sia presente nel file AssemblyInfo.cs.

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

e controlla anche questa riga nel metodo Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Il tuo file di configurazione sembra corretto. Quindi, è necessario registrare il file di configurazione Log4net nell'applicazione. Quindi puoi usare il codice seguente:

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

Dopo il processo di registrazione, è possibile chiamare la definizione seguente per chiamare il logger:

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

log.Error("Sample log");

0

Per me ho dovuto spostare Logger in un pacchetto Nuget. Il codice seguente deve essere aggiunto nel progetto del pacchetto NuGet.

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

Vedi https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ per maggiori dettagli.


Cerca di evitare i collegamenti come risposte. Potrebbero non funzionare sempre. Forse modifica la tua risposta per includere un riepilogo delle informazioni nel link.
Derek C.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.