2010-02-14 13 views
30

Ich baue gerade eine ASP.Net-MVC-Anwendung mit log4net für die Protokollierung, aber der Logger scheint nur zufällig zu stoppen. Es wird glücklich für eine Weile protokollieren und dann aufhören, und dann wird es nach einer gewissen Zeit wieder beginnen. Ich bin mir nicht einmal sicher, was es dazu bringt, das Logging wieder aufzunehmen. Ich rede nicht davon, dass nur ein paar Nachrichten verloren gehen - manchmal verschwindet es für eine lange Zeit, etwa eine Stunde oder so.Log4net beendet die Protokollierung nach dem Zufallsprinzip.

Warum würde es so stoppen und starten? Wie sollte ich das richtig konfigurieren, damit es nicht willkürlich stoppt?

Hier ist meine Konfiguration:

<log4net debug="true"> 
<appender name="RollingLogFileAppender" 
     type="log4net.Appender.RollingFileAppender"> 

    <file value="..\Logs\\CurrentLog.txt" /> 
    <appendToFile value="true" /> 
    <datePattern value="yyyyMMdd" /> 

    <rollingStyle value="Date" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <acceptOnMatch value="true" /> 

    <levelMin value="INFO" /> 
    <levelMax value="FATAL" /> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern 
    value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
    </layout> 

</appender> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 

+1

In meinem Fall ist es die Protokollierung wurde das Zurücksetzen (Neukonfiguration es, nicht durch Design ..), dass diese Art von Problemen verursacht - siehe http://neilkilbride.blogspot.com.au /2008/04/configure-log4net-only-once.html – Jonno

+0

Würde es Ihnen etwas ausmachen, eine Antwort oder einen Kommentar hinzuzufügen, um zu erklären, was Ihr Problem verursacht hat, wenn Sie einen Grund gefunden haben? –

+0

Ja, es wäre schön zu wissen, was Ihr Problem verursacht hat, wie Mark sagte. Übrigens hatte ich das gleiche Problem und setzte den ReconnectOnError auf True, nachdem die ADONetAppender-Konfiguration für mich funktioniert hatte. – Jportelas

Antwort

56

Log4Net wird fail silently wenn etwas schief geht, und es ist nicht imstande, seine Appen zu schreiben. Dies ist eigentlich eine gute Sache, da es bedeutet, dass ein wenig fehlgeschlagene Protokollierung ein ansonsten gesundes System nicht zum Absturz bringt, aber es kann nervig sein, wenn etwas nicht wie erwartet protokolliert wird.

Ihre beste Wette ist es, log4net eigene internal logging zu aktivieren, um einige Diagnosen zu machen und (hoffentlich) herauszufinden, warum es scheitert.

So in Ihrer App-Konfigurationsdatei hinzufügen:

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

, die auf der internen Protokollierung aktivieren wird, die System.Diagnostics.Trace gesendet wird, so dass Sie hinzufügen können:

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

dies ein erfassen Datei.

+1

Haben Sie ein vollständigeres Beispiel für eine solche Konfigurationsdatei? Ich habe zahlreiche Variationen ausprobiert und bekomme immer wieder XML-Fehler vom XmlSerializationReader. Selbst ein leerer '' Tag ist der Unterschied zwischen Ausnahme und nicht. –

+0

Ich habe das gleiche Problem, und in meinem Fall sieht es so aus, als ob ich jedes Mal, wenn ich einen Standard-Dateidialog öffne, die [Box] (https://box.com) Icon-Overlay-DLL die in-process log4net.config überschreibt mit seinen eigenen. –

+0

Das ist eigentlich KEINE gute Sache, da es Systemüberwachungs- und Fehlerbenachrichtigungs-Tools geben kann und wenn es die Protokollierung stoppt, gibt es keine Möglichkeit, eine Ausnahme zu bemerken.Hasse dieses beschissene Logging-Tool, es ist immer ein Kopfzerbrechen, egal welche Firma ich gehe, welche Version auch immer verwendet wird, es gibt immer Kopfschmerzen. Crappy Entwickler beschissen Produkt .. – sotn

0

Senden Sie eine Testprotokollmeldung so früh wie möglich in Ihrem Anwendungslebenszyklus, nur eine einfache LogManager.GetLogger("Init").Info("Starting logging") wird tun. Wenn ein anderer referenzierter Code zuerst zum Starten der Protokollierung verwendet wird, kann ein Teil des Initialisierungsprozesses fehlschlagen (da er Einstellungen von einer anderen Assembly lädt, was nur einmal der Fall ist).

hier lesen: https://logging.apache.org/log4net/release/faq.html#first-log

Verwandte Themen