Frage

Ich verwende log4net in meinem Projekt und es gibt ein Problem. Die Hauptfunktion des Programms dauert eine lange Zeit und ich verwende Protokollieren von Informationen über sie zu speichern. Ich benutze FileAppender für das Speichern von Log-Datei.

Meine Anwendung ist auf dem gemeinsamen (local) Ordner und es mehrere Instanzen der Anwendung von einem Pfad ausgeführt sein könnte. In diesem Fall habe ich aus dem ersten Programm nur Informationen melden konnte, andere Instanzen meiner Anwendungen konnte nicht info log weil Protokolldatei gesperrt .

Wenn ich mit "log4net.Appender.FileAppender + MinimalLock" Option gibt es Fälle von Informationsverlust. Nicht alle Protokolle von beiden Instanzen der Datei gesichert.

Wie kann ich dieses Problem lösen und melden Sie sich Informationen aus parallelen Instanzen? Auch das, was über Leistungseinbußen, wenn ich „MinimalLock“ Option?

Danke. Hoffnung für Ihre Hilfe.

War es hilfreich?

Lösung

Fügen Sie einfach die Prozess-ID der Anwendung in dem Log-Datei-Namen. Verschiedene Instanzen Ihrer App wird dann an verschiedene Log-Dateien. Hier ein Beispiel:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Andere Tipps

Ich denke, es ist eine typische Situation, wenn die zentrale Logging-Lösung wünschenswert ist. Statt über Dateien Sorgen und von Performance-Engpässen leiden, würde ich eher log Aussagen asynchron zu einem gewissen Remote-Service-Pumpe, die sich um die Speicherung nehmen und die Protokolle der Handhabung. Werfen Sie einen Blick auf dieses Protokoll Aggregator genannt logFaces wurde mit dem Ziel entworfen, um Anwendungen der Entkopplung von der Verwaltung ihrer Protokolle. Es sollte mit Standard log4net UDP appender arbeiten und Ihre Log-Daten pro Anwendungen partitionieren, Hosts, Fäden, etc .., während Sie log jederzeit Dateien erstellen zu lassen, wenn sie wirklich benötigt wird.

Disclosure . Ich bin der Autor dieses Produkts

Vielleicht melden Sie sich an verschiedene Dateien aus jeder Instanz? Andernfalls würden Sie wahrscheinlich einen separaten Prozess einrichten müssen, die Protokollierung gewidmet ist. Jede Instanz des Programms würde es Nachrichten versenden dort einzuloggen und es würde ihn in die Datei von Anhängen kümmern. Dies könnte SocketAppender erreicht werden, indem vielleicht. Auch finde ich, dass Log-Ausgabe in Chucks Zerschlagung mit RollingFileAppender ist viel einfacher zu handhaben.

Sie können einen benutzerdefinierten appender erstellen, die die Datei und dann schließen sie schreiben öffnet. Sollte es eine gesperrte Datei treffen, könnte es eine kleine Anzahl von Pausenzeiten und versuchen Sie es erneut.

In der benutzerdefinierten appender Sie die Datei auch in gemeinsamem Schreibmodus öffnen könnten, die mehr Autoren erlauben würden, aber dies wird nicht Stücke von Protokollzeilen verhindern, zusammengefügt zu werden.

Wenn Sie nicht viele Daten zu schreiben, die Öffnungs- / Schließmechanismus, oben aufgeführt, ist wahrscheinlich die beste Wahl. Beachten Sie, dass aufgrund der konstanten Öffnen und Schließen der Datei, können Sie eine spürbare Auswirkung auf die Leistung sehen könnte, wenn Sie eine Menge Daten protokollieren.

Ein komplizierter Mechanismus, sondern eine, die eine hohe Performance Logging Pfad bieten könnte: eine Protokollierungsdienst schreiben, die Leitungen über log TCP oder UDP empfängt. Der Service wäre verantwortlich für die Daten Pufferung und auf der Festplatte zu schreiben. Wir haben diesen Ansatz in der Vergangenheit (nicht über Log4Net, sondern als allgemeine Lösung) log zur Verbesserung der Effizienz zu schreiben.

Sehen Sie Definitiv verschiedene Protokolldateien für jeden Prozess zu schaffen, vielleicht mit eindeutigen Dateinamen einen Zeitstempel erzeugt.

Statt MinimalLock InterProcessLock verwendet, kann den Datenverlust einhüllen mehrerer Prozesse Zugriff auf einzelne Protokolldatei reduzieren.

log4net.Appender.FileAppender+InterProcessLock
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top