Fehler beim Anmelden in C #

73

Ich wechsle von der Codierung in C ++ zu C #. Ich muss mein C ++ - Makrosystem für Fehlerprotokollierung / Berichterstellung durch etwas Ähnliches in C # ersetzen.

In meiner C ++ - Quelle kann ich schreiben

LOGERR ("Irgendein Fehler"); oder LOGERR ("Fehler mit den Eingaben% s und% d", stringvar, intvar);

Der Makro- und unterstützende Bibliothekscode übergibt dann die (möglicherweise varargs) formatierte Nachricht zusammen mit der Quelldatei, der Quellzeile, dem Benutzernamen und der Uhrzeit an eine Datenbank. Dieselben Daten werden auch in eine Datenstruktur gestopft, um sie später an den Benutzer zu melden.

Hat jemand C # -Code-Schnipsel oder Zeiger auf Beispiele, die diese grundlegende Fehlerberichterstattung / -protokollierung durchführen?

Bearbeiten: Als ich diese Frage stellte, war ich wirklich neu in .NET und kannte System.Diagnostics.Trace nicht. System.Diagnostics.Trace war das, was ich damals brauchte. Seitdem habe ich log4net in Projekten verwendet, in denen die Protokollierungsanforderungen größer und komplexer waren. Bearbeiten Sie einfach diese XML-Konfigurationsdatei mit 500 Zeilen und log4net erledigt alles, was Sie jemals brauchen werden :)

Rodney Schuler
quelle

Antworten:

72

Viele log4net-Befürworter hier, daher bin ich sicher, dass dies ignoriert wird, aber ich werde meine eigene Präferenz hinzufügen:

System.Diagnostics.Trace

Dies schließt Listener ein, die auf Ihre Trace()Methoden warten und dann in eine Protokolldatei / ein Ausgabefenster / ein Ereignisprotokoll schreiben, die im enthaltenen Framework enthalten sind DefaultTraceListener, TextWriterTraceListenerund die EventLogTraceListener. Hier können Sie Ebenen (Warnung, Fehler, Info) und Kategorien angeben.

Trace-Klasse auf MSDN
Schreiben in das Ereignisprotokoll in einer Webanwendung
UdpTraceListener - Schreiben Sie log4net-kompatible XML-Nachrichten in einen Protokoll-Viewer wie log2console

Chris S.
quelle
20
+1 Kleiner Zusatz, Trace ist genau dann aktiv, wenn Sie mit dem TRACE-Präprozessorsymbol kompiliert haben.
user7116
1
Eine Sache, die mit dem TextWriterTraceListener zu beachten ist, ist, dass es keine Zeitstempel gibt
Chris S
6
Sie können die WriteLine()Methode in überschreiben TextWriterTraceListener, um eine automatische Zeitstempelfunktion in der Protokolldatei zu erreichen. Siehe diesen CodeProject-Artikel , Abschnitt 6.
Robert Harvey
Netter Tipp @ user7116. Ich möchte erwähnen, dass das Kompilieren mit dem Trace-Vorgänger die Leistung verringert. und Sie können es unter "Projekteigenschaften> Erstellen> TRACE-Konstante definieren" aktivieren .
Mahmood Jenami
40

Ich würde empfehlen, sich log4Net anzuschauen . Dieser Beitrag behandelt den Großteil dessen, was Sie für den Einstieg benötigen.

Mitch Wheat
quelle
"Deklarieren Sie zu Beginn jeder Klasse eine Logger-Instanz wie folgt ..." Sie haben mich dort verloren. :-)
Kos
14

Eine weitere gute Protokollierungsbibliothek ist NLog , die an vielen verschiedenen Orten wie Dateien, Datenbanken, Ereignisprotokollierern usw. protokollieren kann.

Mats Fredriksson
quelle
11

Die Unternehmensbibliothek ist eine solide Alternative zu log4net und bietet eine Reihe weiterer Funktionen (Caching, Ausnahmebehandlung, Validierung usw.). Ich benutze es für fast jedes Projekt, das ich baue.

Sehr empfehlenswert.

Eric Schoonover
quelle
1
EL kann im Rahmen der Protokollierung sogar E-Mails versenden. Sehr praktisch bei der Meldung von Produktfehlern.
StingyJack
5

Obwohl ich es persönlich hasse, scheint log4net der De-facto-Standard für die C # -Protokollierung zu sein. Beispielnutzung:

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
Ben Hoffstein
quelle
12
Es erledigt die Arbeit, aber ich hasse die Dokumentation und ärgere mich darüber, dass ich viele Stunden damit verbracht habe, an Konfigurationsdateien zu basteln und im Grunde blind zu fliegen, bis ich relativ einfache Dinge so zum Laufen bringen konnte, wie ich es wollte.
Ben Hoffstein
4
Ich habe log4net verwendet und weiß zu schätzen, dass es ein leistungsstarkes Tool ist (und NHibernate und andere verwenden es). Aber ich bin gespannt, warum die Leute die integrierte .NET 2.0-Ablaufverfolgung nicht gerne verwenden. Mit den verschiedenen Arten von Listenern und einigen Tools scheint es viel weniger chaotisch zu sein als log4net, ein Java-Port.
Chris S
Kann Sie über die Dokumentation (etwas) hören. Aus diesem Grund ist es eine enorme Zeitersparnis, sich den Code anständiger Open-Source-Projekte anzusehen, die ihn verwenden. Danach ist es bei weitem mein Lieblingsprotokollierungsprogramm.
Ted
@Ted: eine nette Idee - Möchten Sie ein paar Projekte empfehlen, die Sie sich ansehen sollten, um mehr über die Protokollierung zu erfahren?
Fostandy
5

Wie ich in einem anderen Thread sagte, verwenden wir das Logging Framework von The Object Guy seit mehreren Jahren in mehreren Produktions-Apps. Es ist super einfach zu bedienen und zu erweitern.

S. Mills
quelle
3

Log4Net ist ein ziemlich umfassendes Protokollierungsframework, mit dem Sie auf verschiedenen Ebenen (Debug, Fehler, Schwerwiegend) protokollieren und diese Protokollanweisungen an möglicherweise unterschiedlichen Stellen ausgeben können (fortlaufende Datei, Webdienst, Windows-Fehler).

Ich kann überall einfach protokollieren, indem ich eine Instanz des Loggers erstelle

private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));

und dann den Fehler protokollieren.

_log.Error("Error messsage", ex);
FryHard
quelle
3

Serilog kommt zu spät zur Party, bringt aber einige interessante Optionen auf den Tisch. Es sieht ähnlich aus wie bei klassischen textbasierten Loggern:

Log.Information("Hello, {0}", username);

Im Gegensatz zu früheren Frameworks werden die Nachricht und die Argumente jedoch nur beim Schreiben von Text in eine Zeichenfolge gerendert, z. B. in eine Datei oder die Konsole.

Die Idee ist, dass Sie, wenn Sie einen Datenspeicher im NoSQL-Stil für Protokolle verwenden, Ereignisse wie die folgenden aufzeichnen können:

{
    Timestamp: "2014-02-....",
    Message: "Hello, nblumhardt",
    Properties:
    {
        "0": "nblumhardt"
    }
}

Die String-Syntax im .NET-Format wurde erweitert, sodass Sie das obige Beispiel wie folgt schreiben können:

Log.Information("Hello, {Name}", username);

In diesem Fall wird die Eigenschaft aufgerufen Name(und nicht 0), was das Abfragen und Korrelieren erleichtert.

Es gibt bereits einige gute Speicheroptionen. MongoDB und Azure Table Storage scheinen für Heimwerker sehr beliebt zu sein. Ich habe ursprünglich Serilog erstellt (obwohl es sich um ein Community-Projekt handelt) und arbeite jetzt an einem Produkt namens Seq , das die Speicherung und Abfrage dieser Art von strukturierten Protokollereignissen ermöglicht.

Nicholas Blumhardt
quelle
2

Sie können die integrierte .NET-Protokollierung verwenden. Schauen Sie sich TraceSource und TraceListeners an, sie können in der .config-Datei konfiguriert werden.

CSharpAtl
quelle
1

Das Gleiche gilt für log4net. Ich füge meine zwei Bits hinzu, da es für den tatsächlichen Gebrauch sinnvoll ist, einige Open-Source-Implementierungen zu betrachten, um reale Codebeispiele mit einigen praktischen Ergänzungen zu sehen. Für log4net würde ich vorschlagen, den Subtext von oben zu betrachten . Schauen Sie sich insbesondere die Bits für Anwendungsstart und Assemblyinfo an.

Ted
quelle
1

Neben einigen Kommentaren zur Verwendung der System.Diagnostics-Methoden für die Protokollierung möchte ich auch darauf hinweisen, dass das DebugView- Tool sehr gut geeignet ist, um die Debug-Ausgabe bei Bedarf zu überprüfen - es sei denn, Sie benötigen sie Um eine Protokolldatei zu erstellen, starten Sie DebugView bei Bedarf.

Chris Ballard
quelle
1

Die in System.Diagnostics integrierte Ablaufverfolgung ist in .NET Framework in Ordnung und wird in vielen Anwendungen verwendet. Einer der Hauptgründe, warum ich immer noch log4net verwende, ist, dass der integrierten .NET Framework-Ablaufverfolgung viele der nützlichen voll funktionsfähigen Appender fehlen, die log4net bereits integriert bietet.

Zum Beispiel gibt es in .NET Framework wirklich keinen guten Listener für fortlaufende Dateiverfolgung, außer dem in einer VB.NET-DLL, der wirklich nicht alle Funktionen bietet.

Abhängig von Ihrer Entwicklungsumgebung würde ich die Verwendung von log4net empfehlen, sofern keine Tools von Drittanbietern verfügbar sind. Dann würde ich sagen, dass Sie die System.Diagnostics-Ablaufverfolgungsklassen verwenden. Wenn Sie wirklich einen besseren Appender / Tracelistener benötigen, können Sie ihn jederzeit selbst implementieren.

Beispielsweise verlangen viele unserer Kunden, dass wir bei der Installation auf ihren Unternehmenscomputern keine Open-Source-Bibliotheken verwenden. In diesem Fall passen die .NET Framework-Ablaufverfolgungsklassen perfekt zusammen.

Zusätzlich - http://www.postsharp.org/ ist eine AOP-Bibliothek, die ich untersuche und die möglicherweise auch bei der Protokollierung hilft, wie hier im Codeprojekt gezeigt: http://www.codeproject.com/KB/dotnet/log4postsharp- intro.aspx .

Wil P.
quelle
1

ExceptionLess ist eines der einfachsten Nuget-Pakete, die für die Protokollierung verfügbar sind. Es ist ein Open Source Projekt. Nicht behandelte Ausnahmen werden automatisch behandelt, und Optionen für manuelle Protokolle sind verfügbar. Sie können sich online oder als Selbsthost auf dem lokalen Server anmelden .

gmsi
quelle
1
Ich arbeite am Exceptionless-Projekt und beantworte gerne alle Fragen. Wir haben Protokollierungsziele für alle wichtigen Protokollierungs-Frameworks, sodass Sie mit Exceptionless (kostenlose Protokollnachrichten + nicht behandelte Ausnahmen)
sofort