Ich habe mehrere Prozesse gleichzeitig ausgeführt, die ich in derselben Datei protokollieren möchte.
Wir haben Enterprise Library 4.1 Logging Application Block (mit einem RollingFlatFileTraceListener
) verwendet, und es funktioniert gut, abgesehen von der Tatsache, dass eine GUID dem Protokolldateinamen vorangestellt wird, wenn zwei Prozesse versuchen, in die Protokolldatei zu schreiben zur gleichen Zeit (eine Eigenart von System.Diagnostics.TextWriterTraceListener
glaube ich).
Ich habe verschiedene Dinge ausprobiert, einschließlich des Aufrufs von Logger.Writer.Dispose()
nach dem Schreiben in die Protokolldatei, aber es ist nicht ideal, jedes Mal, wenn ein Protokolleintrag geschrieben wird, einen blockierenden Aufruf auszuführen.
Die EntLib-Foren schlagen vor, MSMQ mit einem Distributor Service zu verwenden, aber das ist keine Option, da MSMQ in meiner Firma nicht erlaubt ist.
Gibt es einen anderen Weg, wie ich schnell und einfach von mehreren Threads / Prozessen in dieselbe Datei einloggen kann?
Entschuldigung, aber die Antwort ist nein. Die File TraceListeners sperren die Ausgabedatei, sodass nur ein TraceListener in einer Datei protokollieren kann.
Sie können andere Ablaufverfolgungslistener versuchen, die nicht dateibasiert sind (z. B. Datenbank, Ereignisprotokoll).
Eine weitere Option, die ich mir vorstellen kann, wäre, einen eigenen Logging-Dienst (out of process) zu schreiben, der sich in der Datei anmeldet und LogEntries akzeptiert. Erstellen Sie dann einen benutzerdefinierten Ablaufverfolgungslistener, der eine Nachricht an Ihren Dienst sendet.
Dies ist möglicherweise keine gute Idee, da Sie ein wenig benutzerdefinierte Entwicklung haben und die Leistung beeinträchtigen könnte, da es sich um einen Anruf außerhalb des Prozesses handelt. Grundsätzlich richten Sie Ihren eigenen Pseudo-Distributor-Service ein.
EntLib sperrt die Protokolldatei, wenn sie darauf schreibt. Daher können 2 Prozesse nicht in derselben Protokolldatei schreiben.
Als wir dieses Problem hatten, dass wir von vielen unterschiedlichen Orten an denselben Ort einloggen mussten, haben wir die Datenbankprotokollierung verwendet.
Wenn Sie sich zu 100% in einer Textdatei anmelden, können Sie sich in einzelne Protokolldateien einloggen und dann ein Programm schreiben, um diese Dateien zusammenzuführen.
Das Problem tritt auf, wenn der App-Pool rezykliert und überlappende Threads zulässt. Der schließende Thread hat es noch geöffnet, und der neue Thread erhält den Fehler. Versuchen Sie, das überlappende Recyclingverhalten in IIS zu deaktivieren, oder erstellen Sie eine eigene Version des Textwriter.
Tags und Links c# multithreading logging enterprise-library