So finden Sie log4net-Probleme

191

Ich benutze log4net die ganze Zeit, aber eine Sache, die ich nie herausgefunden habe, ist, wie man sagt, was im Inneren vor sich geht. Zum Beispiel habe ich in meinem Projekt einen Konsolen-Appender und einen Datenbank-Appender. Ich habe einige Änderungen an der Datenbank und dem Code vorgenommen, und jetzt funktioniert der Datenbank-Appender nicht mehr. Ich werde irgendwann herausfinden, warum, aber es würde sehr helfen, wenn ich sehen könnte, was in log4net vor sich geht.

Erzeugt log4net eine Ausgabe, die ich anzeigen kann, um die Ursache meines Problems zu ermitteln?

John M Gant
quelle

Antworten:

293

Zuerst müssen Sie diesen Wert in der Anwendungskonfigurationsdatei festlegen:

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

Um die Datei zu bestimmen, in der Sie die Ausgabe speichern möchten, können Sie den folgenden Code in dieselbe .config-Datei einfügen:

<configuration>
...

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

...
</configuration>

Eine ausführlichere Erklärung finden Sie unter "Wie aktiviere ich das interne log4net-Debugging?". auf der log4net FAQ Seite .

David Espart
quelle
10
Stellen Sie einfach sicher, dass der Prozess, unter dem Ihre Anwendung ausgeführt wird, Rechte für den Pfad hat, in dem Sie Ihre Protokollierungstextdatei erstellen möchten ("C: \ tmp \ log4net.txt" im obigen Beispiel)
NMrt
3
Sieht aus wie das interne Debugging keine Zeitstempel hat
snit80
4
Ich habe von C:\tmp\log4net.txtzu gewechselt C:\log4net.txt, dann kann es eine Textdatei generieren.
Frank Myat Do
6
Nur eine Anmerkung, ich fand den lustigen Weg. Stellen Sie sicher, dass dies <configSections></configSections>der erste Eintrag unter ist <configuration>. Andernfalls erhalten Sie einen Fehler.
Nick
2
Hier wird nicht die Zeit für die Einträge in der Protokolldatei angezeigt. Ich habe versucht, Attribute traceOutputOptions="TimeStamp"und traceOutputOptions="DateTime"das addTag festzulegen, aber es ändert nichts am Inhalt der Protokolldatei. Weiß jemand, wie man log4net so einrichtet, dass die Zeit für jede Zeile / jeden Eintrag in der Ablaufverfolgungsprotokolldatei angezeigt wird?
Ulysses Alves
43

Wenn Sie eine log4net-Konfigurationsdatei verwenden, können Sie das Debuggen dort auch aktivieren, indem Sie den obersten Knoten in Folgendes ändern:

<log4net debug="true">

Dies funktioniert, sobald die Konfiguration neu geladen wurde und vorausgesetzt, Ihr Trace-Listener ist ordnungsgemäß eingerichtet.

Bolo
quelle
6
Sobald dieses Flag aktiviert ist, können Sie die Diagnoseprotokolle von log4net im Ausgabefenster von Visual Studio anzeigen
Naren
24

Zusätzlich zu der obigen Antwort können Sie diese Zeile verwenden, um das Protokoll in Echtzeit anstelle der Ausgabe c: \ tmp \ log4net.txt anzuzeigen.

log4net.Util.LogLog.InternalDebugging = true;

In einer Konsolen-App können Sie dies beispielsweise hinzufügen und dann die Ausgabe in Echtzeit verfolgen. Es ist gut, log4net in einem kleinen Test-Harness zu debuggen, um zu sehen, was mit dem Appender passiert, den Sie testen.

JP Toto
quelle
8

Stellen Sie sicher, dass die Stammanwendung, in der sich Ihr Einstiegspunkt befindet, etwas in log4net protokolliert. Geben Sie eine davon:

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

Mit 2.0.8 hatte ich eine interessante Situation. Ich habe ein Bibliotheksprojekt und ein Test-Exe-Projekt erstellt, die die Funktionen demonstrieren. Das Bibliotheksprojekt wurde so eingerichtet, dass es Log4net verwendet, ebenso wie das exe-Projekt. Das exe-Projekt verwendete das Assemblyinfo-Attribut, um die Konfiguration zu registrieren, aber ich erhielt weder eine Protokollausgabe an die Konsole noch an die Protokolldatei. Als ich die interne Debug-Protokollierung von log4net aktiviert habe, wurden einige interne Nachrichten an die Konsole geschrieben, aber immer noch keine meiner normalen Protokolle. Es wurden keine Fehler gemeldet. Alles begann zu funktionieren, als ich den obigen Code zu meinem Programm hinzufügte. Log4net wurde ansonsten korrekt eingerichtet.

K0D4
quelle
1
hat auch meine gerettet :-)
costa
2

Wenn das interne Protokoll nicht genügend Informationen enthält, ist es sehr einfach, den Quellcode zu erstellen und zu debuggen . Wenn Sie dies nicht mit Ihrem Entwicklungsprojekt verwechseln möchten, fügen Sie eine einfache Konsolenanwendung hinzu, die nur eine Nachricht protokolliert, kopieren Sie Ihre Projekte log4net.configin diese Anwendung und debuggen Sie die betreffende Klasse.

StuartN
quelle
2

In log4net 2.0.8 scheint es nicht möglich zu sein, die Protokollierung mit log4net in einer separaten DLL durchzuführen. Wenn ich das versucht habe, sind die Ergebnisse sehr seltsam: Es wird keine Protokollierung mehr durchgeführt. Und die Initialisierung von log4net mit der Debug-Option zeigt keine Fehler.

Wie K0D4 sagte, sollten Sie einen Verweis auf log4net in Ihrem Hauptmodul haben und es sollte einmal beim Start des Programms aufgerufen werden und alles ist in Ordnung.

In der nächsten Version von log4net wird dieser Fehler wahrscheinlich behoben.

olaf870
quelle