2009-07-15 5 views
1

Ich habe eine Webanwendung, die einige Informationen in eine Datei protokolliert. Ich bin auf der Suche nach einer einfachen thread-sicheren nicht blockierenden Datei-Logger-Klasse in C#. Ich habe wenig Erfahrung mit Threading. Ich weiß, dass es große Logging-Komponenten wie log4Net, Enterprise Library Logging Block, ELMAH gibt, aber ich möchte keine externe Abhängigkeit für meine Anwendung. Ich habe über die Verwendung dieser Warteschlangenimplementierung nachgedacht http://www.codeproject.com/KB/cpp/lockfreeq.aspxEinfache Thread-sichere nicht blockierende Datei-Logger-Klasse in C#

Antwort

0

Die FileStream.BeginWrite-Methode drückt die Schreiboperation auf einen Thread, der vom System verwaltet wird. Das ist das einfache bisschen.

Wenn Sie Ihre Nachrichten in eine synchronisierte Warteschlange stellen und die EndWrite-Methode das nächste Element aus der Warteschlange ziehen, wird die gesamte Protokollierung für die betreffende App deaktiviert. Der letzte Schritt besteht darin, Nachrichten in die Warteschlange zu schreiben, um ein Ereignis festzulegen. Wenn die Warteschlange leer ist, wenn EndWrite nach der nächsten Nachricht sucht, kann sie auf das Festlegen des Ereignisses warten.

1

, wenn Sie keine externe Bibliothek verwenden möchten, können Sie Trace Klasse

+1

Ich würde auch für die Trace-Klasse stimmen, wenn eine externe Abhängigkeit nicht erforderlich ist. Außerdem fügen viele Entwickler nur Komponenten wie Log4net und Enterprise Lib hinzu, ohne die Komplexität ihrer Anwendung zu berücksichtigen. Die Debug- und Trace-Klassen in .NET können für viele kleine und mittelgroße Anwendungen ausreichen. Sie können ihr Verhalten anpassen, indem Sie die Konfigurationseinträge ändern oder indem Sie Ihren eigenen TraceListener schreiben. – A9S6

0

verwenden Ich habe einen einfachen Logging-Mechanismus in meinem Projekt im Büro durchgeführt.

Ich habe eine Protokollklasse, die freigegeben ist (Static C#).

Innerhalb dieser Klasse habe ich eine synchronisierte Warteschlange, und es hat einen eigenen Thread.

Dann in diesem Thread, ich habe es nur ein AutoresetEvent mit Ihrer eigenen definierten WaitTime (ich verwende 250ms).

Dann, wenn dieses ResetEvent abläuft, sammle ich, was gerade in der Warteschlange ist (mit DeQueue) und schreibe jedes in die Datei.

Dinge, an die Sie sich erinnern sollten ... Haben Sie eine Klasse oder Struktur, die das Datum speichern kann, an dem der Eintrag eingegeben wurde, anstatt die Zeit, die Sie auf die Festplatte geschrieben haben.

Wenn Sie möchten, dass Ihre Anwendung schnell beendet wird, legen Sie eine Methode offen, die das Ereignis so einstellt, dass es den Ruhezustand verlässt und ordnungsgemäß beendet wird.

+0

Können Sie Code anzeigen? – M4N

+0

Ich komme mit der gleichen Lösung, aber dann realisiert, wenn Sie mit DeQueue blockieren Sie die Warteschlange, damit Sie die Protokollierung blockieren. Auch wenn es alle 250ms passiert, blockierst du immer noch. – tesla