it-swarm.com.de

Wie kann ich log4net-Probleme aufspüren?

Ich benutze log4net die ganze Zeit, aber ich habe nie herausgefunden, wie man im Inneren sieht, was los ist. Ich habe beispielsweise einen Konsolen-Appender und einen Datenbank-Appender in meinem Projekt. Ich habe ein paar Änderungen an der Datenbank und am Code vorgenommen, und jetzt funktioniert der Datenbank-Appender nicht mehr. Ich werde schließlich herausfinden, warum das so ist, 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?

167
John M Gant

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 Debuggen von log4net?' Auf der Seite log4net FAQ .

262
David Espart

Wenn Sie eine log4net-Konfigurationsdatei verwenden, können Sie das Debugging dort auch aktivieren, indem Sie den obersten Knoten wie folgt ändern:

<log4net debug="true">

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

33
Bolo

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

log4net.Util.LogLog.InternalDebugging = true;

Sie können dies beispielsweise in einer Konsolen-App hinzufügen und die Ausgabe dann in Echtzeit verfolgen. Es ist gut für das Debuggen von log4net in einer kleinen Testumgebung, um zu sehen, was mit dem zu testenden Appender passiert.

19
JP Toto

Stellen Sie sicher, dass die Stammanwendung, an der sich Ihr Einstiegspunkt befindet, etwas in log4net protokolliert. Gib eins 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, das seine Fähigkeiten demonstriert. Das Bibliotheksprojekt wurde so eingerichtet, dass es Log4net wie das Exe-Projekt verwendet. Das exe-Projekt verwendete das assemblyinfo-Attribut, um die Konfiguration zu registrieren. Ich erhielt jedoch keine Protokollausgabe für die Konsole oder die Protokolldatei. Wenn ich die interne Log4net-Debug-Protokollierung einschaltete, wurden einige interne Meldungen in die Konsole geschrieben, jedoch keine meiner normalen Protokolle. Es wurden keine Fehler gemeldet. Alles fing an zu arbeiten, als ich den obigen Code zu meinem Programm hinzufügte. Log4net wurde ansonsten korrekt eingerichtet.

3
K0D4

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

Wie K0D4 schon sagt, sollten Sie einen Verweis auf log4net in Ihrem Hauptmodul haben und sollten es einmal beim Start des Programms aufrufen und alles ist in Ordnung.

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

0
olaf870

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 den log4net.config Ihres Projekts in diese Anwendung und debuggen Sie die betreffende Klasse.

0
StuartN