Fehlerprotokollierung in C #
-
02-07-2019 - |
Frage
Ich mache meinen Wechsel von Codierung in C ++ zu C #. Ich brauche meine C ++ Fehlerprotokollierung / Reporting-Makro-System mit etwas ähnlichem in C # ersetzen.
In meiner C ++ Quelle kann ich schreiben
logerr ( "Einige Fehler"); oder Logerr ( "Error mit Eingängen% s und% d", StringVar, IntVar);
Das Makro & Unterstützung Bibliothekscode übergibt dann die (möglicherweise varargs) formatierte Nachricht in einer Datenbank zusammen mit der Quelldatei, Source-Leitung, den Benutzernamen und Zeit. Die gleichen Daten werden auch in eine Datenstruktur gestopft später für den Benutzer berichten.
Hat jemand C # Code-Schnipsel oder Zeiger auf Beispiele, die diese grundlegende Fehlerberichterstattung / Protokollierung tun?
Edit: In der Zeit, die ich diese Frage gestellt ich wirklich neu zu .NET und war nicht bewusst System.Diagnostics.Trace. System.Diagnostics.Trace war das, was ich damals brauchte. Seitdem habe ich log4net an Projekten eingesetzt, in denen die Logging-Anforderungen waren größer und komplexer. Bearbeiten Sie einfach, dass die XML-Konfigurationsdatei 500 Zeilen und log4net wird alles tun, werden Sie jemals brauchen werden:)
Lösung
Viele log4net spricht hier also bin ich sicher, dass dies wird ignoriert, aber ich werde meinen eigenen Vorlieben hinzufügen:
System.Diagnostics.Trace
Dazu gehört Zuhörer, die für Ihre Trace()
Methoden zu hören, und dann in ein Protokolldatei / Ausgabefenster / Ereignisprotokoll schreiben, die im Rahmen, die enthalten sind, sind DefaultTraceListener
, TextWriterTraceListener
und die EventLogTraceListener
. Es ermöglicht Ihnen, Ebenen (Warnung, Fehler, Info) und Kategorien angeben.
Trace-Klasse auf MSDN
Schreiben in das Ereignisprotokoll in einer Web Application
UdpTraceListener - log4net kompatible XML-Nachrichten an einen Log-Viewer schreiben wie log2console
Andere Tipps
Eine weitere gute Logging-Bibliothek ist NLog , was eine Menge von verschiedenen Orten anmelden kann, wie zum Beispiel Dateien, Datenbanken, Event Logger etc.
Ich benutze Das Objekt Guy Logging-Framework --as die meisten Menschen tun, die es versuchen. Dieser Kerl hat einige interessante Kommentare darüber rel="nofollow.
Enterprise Library eine solide Alternative ist es, log4net und es bietet auch eine Reihe von anderen Funktionen (Caching, Ausnahmebehandlung, Validierung, etc ...). Ich benutze es auf fast jedes Projekt, das ich bauen.
Sehr zu empfehlen.
Auch wenn ich persönlich hasse es, log4net scheint der De-facto-Standard zu sein für C # Protokollierung. Verwendungsbeispiel:
log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
Wie ich in einem anderen Thread gesagt, haben wir das Objekt Guy Logging-Framework in mehreren benutze Produktion Apps für mehrere Jahre. Es ist super einfach zu bedienen und erweitern.
Log4Net ist ein ziemlich umfassendes Logging-Framework, das es Ihnen erlaubt, verschiedene Ebene einzuloggen (Debug , Fehler, Fatal) und Ausgang dieses Protokoll Aussagen können verschiedenen Orte (Roll Datei, Web Service, Windows-Fehler)
Ich bin in der Lage problemlos überall anmelden, indem eine Instanz des Loggers zu schaffen
private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));
und dann den Fehler zu protokollieren.
_log.Error("Error messsage", ex);
Serilog ist spät zur Party hier, aber bringt einige interessante Optionen auf den Tisch. Es sieht aus wie klassische textbasierte Logger zu verwenden:
Log.Information("Hello, {0}", username);
Aber im Gegensatz zu früheren Frameworks, es macht nur die Nachricht und Argumente in einen String beim Schreiben von Text, z.B. in einer Datei oder die Konsole.
Die Idee ist, dass, wenn Sie mit einem ‚NoSQL'-Stil Datenspeicher für Protokolle, können Sie Ereignisse aufzeichnen wie:
{
Timestamp: "2014-02-....",
Message: "Hello, nblumhardt",
Properties:
{
"0": "nblumhardt"
}
}
Die .NET-Format-String-Syntax erweitert wird, so dass Sie das obige Beispiel schreiben können wie:
Log.Information("Hello, {Name}", username);
In diesem Fall wird die Eigenschaft genannt Name
wird (statt 0
), so dass Abfrage- und Korrelation zu erleichtern.
Es gibt bereits einige gute Möglichkeiten für die Lagerung. MongoDB und Azure Tabellen Speicher scheinen für DIY sehr beliebt zu sein. Ich baute ursprünglich Serilog (obwohl es sich um ein Gemeinschaftsprojekt ist) und ich arbeite jetzt an einem Produkt namens Seq , die Lagerung bietet und Abfragen dieser Art von strukturierten Protokollereignissen.
Sie können in .NET Logging gebaut werden, benutzen. Schauen Sie in Trace und Tracelisteners, können sie in der .config-Datei konfiguriert werden.
Das Gleiche gilt für log4net. Ich füge meine zwei Bits, weil für die tatsächlichen Einsatz, ist es sinn bei einigen Open-Source-Implementierungen aussehen läßt reale Welt Code-Beispiele mit einigen Ergänzungen praktisch zu sehen. Für log4net, würde ich aus der Spitze von meinem Kopf vorschlagen Blick auf Subtext . Vor allem beim Start der Anwendung einen Blick und Assembly Bits.
Im Anschluss an die paar Anmerkungen zu der Verwendung der System.Diagnostics Methoden zur Protokollierung real, möchte ich auch darauf hinweisen, dass die
Die eingebaute System.Diagnostics in Tracing ist in .NET Framework in Ordnung und ich benutze es auf vielen Anwendungen. Allerdings ist einer der Hauptgründe, noch log4net ich verwende, ist, dass das .NET Framework-Tracing gebaut in viele der nützlichen voll funktionsAppen fehlt, die bereits liefert log4net eingebaut. Zum Beispiel gibt es wirklich keinen guten Roll Datei Trace-Listener in .NET Framework definierte andere als die in einer VB.NET DLL, die wirklich nicht, dass alle voll funktions. Je nach Entwicklungsumgebung würde ich mit log4net empfehlen, es sei denn 3rd-Party-Tools nicht verfügbar sind, dann würde ich sagen, verwenden Sie die System.Diagnostics Tracing-Klassen. Wenn Sie wirklich eine bessere appender / Tracelistener benötigen, können sie es selbst implementieren. Zum Beispiel viele unserer Kunden verlangen, dass wir nicht nutzen Open-Source-Bibliotheken, wenn sie auf ihren Firmen Maschinen installiert, so dass in diesem Fall der .NET Framework-Tracing-Klassen eine perfekte Passform sind. Zusätzlich - http://www.postsharp.org/ ist eine AOP-Bibliothek Ich bin auf der Suche in, dass auch in Protokollierung auf Code-Projekt hier demonstriert helfen kann: http: // www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx .
ausnahmslose ist eine der einfachsten nuget Paket für die Protokollierung zu verwenden. Es ist ein Open-Source-Projekt . Es kümmert sich automatisch um nicht behandelte Ausnahme und Optionen für manuell protokolliert verfügbar sind . Sie können Online-log oder Selbst Host auf lokalen Server.
Log4Net, wie andere gesagt haben, ist ziemlich verbreitet und ähnlich wie Log4j die Ihnen helfen, wenn Sie jemals eine Java tun.
Sie haben auch die Möglichkeit, die Logging Application Block http: // www. codeproject.com/KB/architecture/GetStartedLoggingBlock.aspx