log4net non funziona


123

Ehi, ho questa configurazione nel mio 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>

ma log4net non funziona. Il mio progetto si compila bene e non ricevo neanche errori durante il debug. Le righe in cui dico di essere log.debug("somemessage")eseguite correttamente, ma non riesco a trovare il mylog.logfile, quindi dov'è?


Assicuratevi di controllare anche questo: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Risposte:


298

Un trucco per questo tipo di cose è assicurarti di aggiungere l' XmlConfiguratorattributo all'assembly inserendo la seguente riga nel tuo AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Altrimenti log4net non si attiva mai.


5
Questo metodo utilizzato per il lavoro nel mio progetto, ma ha smesso di funzionare in qualche modo. Ho dovuto usare questo metodo stackoverflow.com/a/1479343/193634 per farlo funzionare di nuovo.
Rosdi Kasim

Ho appena provato di nuovo e funziona bene. Molto probabilmente non stai facendo riferimento / caricando l'assembly che contiene AssemblyInfonon appena hai pensato.
Kirk Woll

Per coloro che utilizzano l'appender ELMAH questa è la strada da percorrere. Avevo "log4net.Config.XmlConfigurator.Configure ();" in global.asax.cs e funzionava bene per l'appender di file ma non per gli appender ELMAH.
user3885927

Ho spuntato questa risposta e ho scoperto che avevo bisogno di modificarla con "[assembly: log4net.Config.XmlConfigurator (Watch = true)]"
David Savage

49

Immagino che log4net non stia registrando affatto o che il file non finisca dove ti aspetti.

In primo luogo, hai effettivamente chiamato

XmlConfigurator.Configure()

ovunque nel tuo codice? Se lo snippet xml sopra è nel file di configurazione dell'applicazione, questa chiamata farà il trucco. Se lo snippet xml si trova nel suo file, dovrai usare l' .Configure(string)overload che prende il percorso del file. Senza questa chiamata (o apparentemente l'attributo a livello di assembly menzionato da Kirk Woll), log4net non registrerà affatto.

Se ritieni che sia tutto fatto e log4net dovrebbe essere loggato, allora forse dovresti inserire un percorso completo per il file di log mentre esegui il debug. Ciò ti consentirà di essere sicuro di dove dovrebbe essere il file .


33

C'è un altro piccolo trucco, vedi qui: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

il [assembly: log4net.Config.XmlConfigurator]metodo non funziona con app.config. Se configuri log4net da app.config, devi utilizzare il log4net.Config.XmlConfigurator.Configure()metodo.


Per la cronaca, entrambi i metodi hanno funzionato per me in un'applicazione console.
rageit

Confermo la soluzione sopra - ho dovuto invocare log4net.Config.XmlConfigurator.Configure (); nel mio codice (che utilizza app.config per far funzionare correttamente log4net. Le righe che vengono stampate in modo efficace sono quelle successive all'esecuzione del metodo Configure ().
luisa rosi

19

Ecco la mia lista di controllo per quando log4net si sta dimostrando recalcitrante:

  • assicurati che il file log4net.config venga copiato nella cartella bin \ durante la creazione (impostato su "Copia se più recente" nel compilatore)
    • quando si ha a che fare con il codice installato, assicurarsi che log4net.config sia arrivato per il giro (impostato su 'Content' nel compilatore)
  • assicurarsi che l'utente che esegue il processo abbia i diritti di scrittura sulla cartella in cui devono essere scritti i log
  • in caso di dubbio, concedi autorizzazioni promiscue a c: \ temp \ e ottieni tutto per accedere lì ()
  • avvia Sysinternal / Dbgview.exe per vedere se questo ti dice qualcosa

3
"assicurati che il file log4net.config venga copiato nella cartella bin \ durante la compilazione (imposta 'Copia se più recente' nel compilatore)" -> salva la mia giornata! Grazie così tanto!
Hoang Nguyen Huu

8

Per un progetto ASP.NET MVC che aggiunge

log4net.Config.XmlConfigurator.Configure();

a Global.asax.cs aiuta anche:

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();
    }
}

1
Ho avuto un problema molto strano con questo, in produzione e sul computer del mio capo i logger hanno funzionato bene in questo modo, ma non fino alla risposta di Kirk ha funzionato sul mio computer. Ho solo pensato di far sapere alle persone nel caso in cui avessero problemi simili (progetto MVC tra l'altro).
Shelby115

@ Shelby115, molte molte grazie! Stavo cercando di mettere le mie voci log4Net in ELMAH. Avevo tutto corretto in web.config. Avevo già "log4net.Config.XmlConfigurator.Configure ();" nel mio global.asax.cs ma non funziona. È venuto a questo post SO e ha aggiunto la riga a assemblyInfo.cs basato su Kirk. Ancora non ha funzionato !. Dopo aver letto il tuo commento ho cancellato la voce precedente da global.asax.cs e ha iniziato a funzionare. Ho passato diverse ore su questo e il tuo commento è stato di grande aiuto. Grazie ancora!
user3885927

La voce in global.asax.cs funzionava bene per l'appender di file ma non per gli appender ELMAH. Il modo in cui Kirk ha funzionato per l'appender ELMAH (ho dovuto rimuoverlo specificamente da global.asax.cs)
user3885927

Potresti anche voler assicurarti che log4net disponga delle autorizzazioni di scrittura per la directory configurata per i file di registro.
Oladipo Olasemo

@ Shelby115 Dang, devi amare quando dimentichi la soluzione e il tuo commento risolve il tuo problema. Arrivare a una pagina con una risposta già votata da te è anche un buon indicatore.
Shelby115

7

Questi sono i passaggi che alla fine hanno fatto funzionare la mia registrazione dei file:

  • -Check AssemblyInfo.cs contiene il seguente attributo. [assembly: log4net.Config.XmlConfigurator] . Questo carica log4net.
  • Verificare che la directory del registro disponga delle autorizzazioni di scrittura.
  • Verificare che il logger abbia un formato specificato. Questo viene fatto controllando che ogni elemento nella configurazione abbia un elemento di layout specificato. Per esempio:

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

  • Infine, prova ad attivare la registrazione interna di log4net per abilitare la registrazione della console e il controllo della console. Per fare ciò, aggiungi <add key="log4net.Internal.Debug" value="true"/>al tuo file appSettings.

<add key = "log4net.Internal.Debug" value = "true" /> Questo mi ha aiutato a risolvere il problema. Grazie
Ravi Khambhati

I permessi della directory sono ciò che mi ha fatto
Omar Himada

6

Ho avuto esperienze in cui i sistemi di registrazione falliscono silenziosamente senza sollevare eccezioni. Suppongo che questo abbia senso perché se il logger sta registrando errori, come può registrare un errore che non è in grado di eseguire la registrazione?

Quindi, se il file non viene creato su disco, inizia esaminando le autorizzazioni del file system per assicurarti che l'utente con cui viene eseguita l'applicazione possa scrivere un nuovo file in quella posizione del disco.

A scopo di test potresti voler creare manualmente il file su disco su cui scrivere e aprire i permessi affinché tutti possano scriverci. Se il logger inizia a scrivere su di esso, allora sai che è basato sui permessi piuttosto che sulla configurazione.


2

Da parte mia, ho dimenticato di contrassegnare il file di configurazione da copiare durante la compilazione dell'app.

Copia il file di configurazione nella directory di output

Basta fare clic con il pulsante destro del mouse sul file log4net.config, selezionare la proprietà e quindi scegliere Copia nella directory di output per copiare XXXX


1

Ho provato tutto quanto sopra ma niente ha funzionato. L'aggiunta di questa riga nella sezione app.config ha configSections funzionato per me.

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

Assicurati che Versione PublicKeyTokensia corretto


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

sta dicendo "scrivi miolog.log nella cartella effettiva". Ciò significa che se la tua webapp è sotto IIS, il log verrà scritto in C: \ inetpub \ wwwroot \ appname \ mylog.log.

Se il file di registro non è presente, è possibile che l'account con cui è in esecuzione l'app non disponga dell'autorizzazione di scrittura sulla cartella. È possibile eseguire Process Monitor da SysInternals per vedere se e dove viene scritto un file.

Esegui anche VS in modalità di debug, per vedere se vengono generate eccezioni (Debug-> Eccezioni-> Eccezioni CLR, seleziona Thrown).


0

Nel mio caso dimentico di impostare le proprietà del file log4Net.config come "Content", quindi il file non è stato incluso nel deploy. Quindi presta attenzione:

Compile action : Content

0

Purtroppo nessuno dei precedenti ha aiutato. La configurazione esplicita nella classe da registrare in aggiunta ai suggerimenti di impostazioni precedenti ha fatto il trucco per me.

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

-7

Inoltre dopo alcune ore ho capito perché non funzionava per me ...

avevo:

public static class Program
{

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

ma dovrebbe essere:

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

Quindi assicurati che ILog sia sulla prima riga ...


1
Questa non è sicuramente la causa. Non importa quando inizializzi l'oggetto ILog fintanto che lo fai prima di effettuare una chiamata ai metodi di registrazione, ad esempio _log.Info; _log.error ecc.
Oladipo Olasemo
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.