3 Stimmen

Log4Net RollingFileAppender erzeugt doppelte Protokolle

Ich habe einen WCF-Dienst, der auf einem einzigen Server läuft, und verwende Log4net, um die Nutzung über Protokolleinträge der Ebenen INFO und WARN zu verfolgen. Ich verwende einen RollingFileAppender mit der folgenden sehr standardmäßigen Konfiguration:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="\\mylocation\data\PRD\myApp\MyService"/>
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="-yyyy-MM-dd'.log'" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
   <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="ADONetAppender_SqlServer" />
    </root> 

Ich verwende auch einen ADONetAppender, der umgeleitete Daten der Stufe "WARN" empfängt und sie über eine gespeicherte Prozedur in eine DB-Tabelle im SQL-Server schreibt. Die Konfiguration hierfür ist etwas lang, daher habe ich sie aus Gründen der Lesbarkeit weggelassen.

Ich habe dieses Setup in unseren Entwicklungs- und TST-Umgebungen, wo es einwandfrei funktioniert hat. In der PRD-Umgebung scheint es doppelte Protokolldateien zu erzeugen. Die erste ist nach dem von mir angegebenen Muster benannt, d.h. "logfile-yyyy-mm-dd.log". Die zweite Datei sieht wie ein Zusatz zur ersten aus, wobei das Datumsmuster dupliziert wurde, d.h. "logfile-yyyy-mm-dd.log.-yyyy-mm-dd.log".

Interessant ist auch, dass sich die Einträge in den beiden Dateien zeitlich überschneiden. Datei 1 könnte Einträge von 8 bis 12 Uhr enthalten, und Datei 2 enthält ebenfalls Einträge aus demselben Zeitraum. Bei den Einträgen handelt es sich nicht um Duplikate, sondern sie wurden von verschiedenen Nutzern des Dienstes erstellt. Die Kopien der Dateien 1 und 2 können so gut wie beliebig groß sein, so dass es nicht darum geht, eine Größen- oder Datums-/Zeitschwelle zu erreichen und die nächste erforderliche Protokolldatei zu erzeugen.

Die DB-Tabelleneinträge enthalten alle erwarteten Zeilen, von denen einige in jeder der Protokolldateien enthalten sind. Diese Zeilen werden nur von der WARN-Protokollierung erzeugt, und einige WARNings erscheinen in jeder Protokolldatei.

Ich habe dies an einige log4net-erfahrene Leute in unserem Geschäft weitergegeben, aber niemand hat eine gute Idee, was dieses Verhalten der doppelten Dateien verursachen könnte. Jede Idee von Stackland ist willkommen.

0voto

evanmcdonnal Punkte 42430

Ihr Datumsmuster sollte kein .log nach sich ziehen. Ich bin mir auch nicht sicher, warum Sie zwei Appenders in der Root deklariert haben. Sie sollten in der Lage sein, die Root insgesamt loszuwerden, angesichts der Rest Ihrer Konfiguration hat es keinen Zweck (vorausgesetzt, Sie haben nicht mehr, die nicht im Beispiel ist).

0voto

sluiper Punkte 99

Ich habe festgestellt, dass dies passiert, wenn die Datei, in die protokolliert wird, durch einen anderen Thread oder Prozess gesperrt ist.

Ich nehme an, dass Log4Net die andere Datei erstellt, weil es nicht in die konfigurierte Protokolldatei protokollieren kann und daher eine neue Datei erstellt und in diese protokolliert, aber ich müsste den log4net-Code durchgehen, um mir dieser Annahme sicher zu sein.

Versuchen Sie

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

an das Appender-Element, um den Umfang der Sperrung zu minimieren. Seien Sie sich jedoch bewusst, dass die Verwendung von MinimalLock mit zusätzlichem Overhead verbunden ist: http://logging.apache.org/log4net/release/sdk/log4net.Appender.FileAppender.MinimalLock.html

0voto

Michele Punkte 11

Ich hatte genau das gleiche Problem.

Ich bestätige, dass dies eine Frage der Genehmigung war. In meinem Fall wurden die Protokolldateien von zwei verschiedenen Konten erstellt (von einer geplanten Aufgabe und manchmal von einem manuellen Lauf über die Konsole), und in diesem Fall hatte der Dateiname ein doppeltes Datumsmuster.

Nach dem Zurücksetzen der Berechtigungen für beide Benutzer (den Benutzer des geplanten Prozesses und den interaktiven

G

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X