Come rintracciare i problemi di log4net


191

Uso log4net in continuazione, ma una cosa che non ho mai capito è come dire cosa sta succedendo all'interno. Ad esempio, ho un appender per console e un appender per database nel mio progetto. Ho apportato alcune modifiche al database e al codice e ora l'appender del database non funziona più. Capirò perché alla fine, ma sarebbe di grande aiuto se potessi vedere cosa succede dentro log4net.

Log4net genera alcun tipo di output che posso visualizzare per provare a determinare l'origine del mio problema?

Risposte:


294

Innanzitutto devi impostare questo valore sul file di configurazione dell'applicazione:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Quindi, per determinare il file in cui si desidera salvare l'output, è possibile aggiungere il seguente codice nello stesso file .config:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

È possibile trovare una spiegazione più dettagliata in "Come si abilita il debug interno di log4net?" nella pagina FAQ di log4net .


10
Assicurati solo che il processo in cui è in esecuzione l'applicazione disponga dei diritti per il percorso in cui desideri creare il file di testo di registrazione ("C: \ tmp \ log4net.txt" nell'esempio sopra)
NMrt

3
Sembra che il debug interno non abbia i timestamp
snit80

4
Ho cambiato da C:\tmp\log4net.txta C:\log4net.txt, quindi può generare file di testo.
Frank Myat Gio

6
Solo una nota che ho trovato divertente. Assicurarsi che <configSections></configSections>sia la prima voce in <configuration>. Altrimenti si finisce con un errore.
Nick,

2
Ciò non mostra l'ora per le voci nel file di registro. Ho provato a impostare gli attributi traceOutputOptions="TimeStamp"e traceOutputOptions="DateTime"nel addtag ma non cambia nulla nel contenuto del file di registro. Qualcuno sa come impostare log4net per mostrare l'ora per ogni riga / voce nel file di registro di traccia?
Ulisse Alves l'

43

Se stai usando un file di configurazione log4net puoi anche attivare il debug lì cambiando il nodo superiore in:

<log4net debug="true">

Funzionerà una volta ricaricata la configurazione e supponendo che il listener di tracce sia configurato correttamente.


6
Una volta abilitato questo flag, sarai in grado di vedere i log diagnostici da log4net nella finestra Output di Visual Studio
Naren,

24

Oltre alla risposta precedente, è possibile utilizzare questa riga per visualizzare il registro in tempo reale anziché l'output c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Ad esempio, in un'app console, è possibile aggiungere questo e quindi guardare l'output in tempo reale. È utile per il debug di log4net in un piccolo cablaggio di prova per vedere cosa sta succedendo con l'appender che stai testando.


8

Assicurarsi che l'applicazione principale in cui si trova il punto di ingresso registri qualcosa su log4net. Dagli uno di questi:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

Con 2.0.8, ho avuto una situazione interessante. Ho creato un progetto di libreria e un progetto exe di prova che dimostrerebbe le sue capacità. Il progetto della libreria è stato impostato per utilizzare Log4net come il progetto exe. Il progetto exe utilizzava l'attributo assemblyinfo per registrare la configurazione, ma non ottenevo alcun output di registrazione sulla console o sul file di registro. Quando ho attivato la registrazione debug interna di log4net, ho ricevuto alcuni messaggi interni scritti sulla console, ma ancora nessuno dei miei normali registri. Non sono stati segnalati errori. Tutto ha iniziato a funzionare quando ho aggiunto il codice sopra al mio programma. In caso contrario, Log4net è stato configurato correttamente.


1
salvato anche il mio :-)
costa

2

Se il registro interno non fornisce informazioni sufficienti, è molto semplice creare ed eseguire il debug del codice sorgente . Se non vuoi mescolare questo con il tuo progetto di sviluppo, aggiungi una semplice applicazione console che registra semplicemente un messaggio, copia il progetto log4net.configin questa applicazione ed esegui il debug della classe in questione.


2

In log4net 2.0.8 sembra non essere possibile effettuare la registrazione con log4net in una DLL separata. Se l'ho provato, i risultati sono molto strani: non viene più eseguita alcuna registrazione. E l'inizializzazione di log4net con l'opzione di debug non mostra errori.

Come ha detto K0D4, dovresti avere un riferimento a log4net nel tuo modulo principale e dovrebbe chiamare una volta all'avvio del Programma e tutto va bene.

Nella prossima versione di log4net, questo errore verrà probabilmente risolto.

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.