Was sind die besten oder nützlichsten Konfigurationen für die Protokollierung mit NLog? (Diese können einfach oder komplex sein, solange sie nützlich sind.)
Ich denke an Beispiele wie das automatische Überfahren von Protokolldateien mit einer bestimmten Größe, das Ändern des Layouts (Protokollmeldung), ob es eine Ausnahme gibt oder nicht, das Eskalieren der Protokollstufe, sobald ein Fehler aufgetreten ist usw.
Hier sind einige Links:
Antworten:
Einige davon fallen eher in die Kategorie der allgemeinen NLog- (oder Protokollierungs-) Tipps als in reine Konfigurationsvorschläge.
Hier sind einige allgemeine Protokollierungslinks von hier bei SO (möglicherweise haben Sie einige oder alle bereits gesehen):
log4net vs. Nlog
Best Practices für die Protokollierung
Was bringt eine Holzfassade?
Warum empfehlen Logger die Verwendung eines Loggers pro Klasse?
Verwenden Sie das allgemeine Muster für die Benennung Ihres Loggers basierend auf der Klasse
Logger logger = LogManager.GetCurrentClassLogger()
. Dies gibt Ihnen ein hohes Maß an Granularität in Ihren Loggern und bietet Ihnen große Flexibilität bei der Konfiguration der Logger (Steuerung global, nach Namespace, nach spezifischem Loggernamen usw.).Verwenden Sie gegebenenfalls nicht auf Klassennamen basierende Logger. Möglicherweise haben Sie eine Funktion, für die Sie die Protokollierung wirklich separat steuern möchten. Möglicherweise haben Sie einige Probleme mit der Protokollierung (Leistungsprotokollierung).
Wenn Sie keine auf Klassennamen basierende Protokollierung verwenden, sollten Sie Ihre Protokollierer in einer hierarchischen Struktur (möglicherweise nach Funktionsbereich) benennen, damit Sie Ihre Konfiguration flexibler gestalten können. Beispielsweise könnten Sie einen Funktionsbereich "Datenbank", einen FA "Analyse" und einen FA "UI" haben. Jeder von diesen kann Unterbereiche haben. Sie können also folgende Logger anfordern:
Und so weiter. Mit hierarchischen Protokollierern können Sie die Protokollierung global ("*" oder Root-Protokollierer), nach FA (Datenbank, Analyse, Benutzeroberfläche) oder nach Unterbereich (Database.Connect usw.) konfigurieren.
Logger haben viele Konfigurationsoptionen:
Weitere Informationen dazu, was die einzelnen Optionen bedeuten, finden Sie in der NLog-Hilfe . Die wahrscheinlich bemerkenswertesten Elemente sind die Möglichkeit, Protokollierungsregeln mit Platzhaltern zu versehen, das Konzept, dass mehrere Protokollierungsregeln für eine einzelne Protokollierungsanweisung "ausgeführt" werden können und dass eine Protokollierungsregel als "endgültig" markiert werden kann, sodass nachfolgende Regeln für a nicht ausgeführt werden Protokollierungsanweisung gegeben.
Verwenden Sie GlobalDiagnosticContext, MappedDiagnosticContext und NestedDiagnosticContext, um Ihrer Ausgabe zusätzlichen Kontext hinzuzufügen.
Verwenden Sie zur Vereinfachung "Variable" in Ihrer Konfigurationsdatei. Beispielsweise können Sie Variablen für Ihre Layouts definieren und dann auf die Variable in der Zielkonfiguration verweisen, anstatt das Layout direkt anzugeben.
Sie können auch einen "benutzerdefinierten" Satz von Eigenschaften erstellen, um ihn einem Layout hinzuzufügen.
Oder Sie können beispielsweise "Tag" - oder "Monat" -Layout-Renderer ausschließlich über die Konfiguration erstellen:
Sie können auch Layout-Renderings verwenden, um Ihren Dateinamen zu definieren:
Wenn Sie Ihre Datei täglich rollen, kann jede Datei den Namen "Monday.log", "Tuesday.log" usw. haben.
Haben Sie keine Angst, Ihren eigenen Layout-Renderer zu schreiben. Es ist einfach und ermöglicht es Ihnen, Ihre eigenen Kontextinformationen über die Konfiguration zur Protokolldatei hinzuzufügen. Hier ist beispielsweise ein Layout-Renderer (basierend auf NLog 1.x, nicht 2.0), der die Trace.CorrelationManager.ActivityId zum Protokoll hinzufügen kann:
Teilen Sie NLog mit, wo Ihre NLog-Erweiterungen (welche Assembly) folgendermaßen aussehen:
Verwenden Sie den benutzerdefinierten Layout-Renderer wie folgt:
Verwenden Sie asynchrone Ziele:
Und Standard-Ziel-Wrapper:
gegebenenfalls. Weitere Informationen hierzu finden Sie in den NLog-Dokumenten.
Weisen Sie NLog an, die Konfiguration zu überwachen und automatisch neu zu laden, wenn sie sich ändert:
Es gibt verschiedene Konfigurationsoptionen, die bei der Fehlerbehebung bei NLog helfen
Weitere Informationen finden Sie in der NLog-Hilfe.
NLog 2.0 fügt LayoutRenderer-Wrapper hinzu, mit denen zusätzliche Verarbeitungen für die Ausgabe eines Layout-Renderers durchgeführt werden können (z. B. Trimmen von Leerzeichen, Groß- und Kleinschreibung usw.).
Haben Sie keine Angst, den Logger zu verpacken, wenn Sie Ihren Code von einer harten Abhängigkeit von NLog isolieren möchten, aber verpacken Sie ihn korrekt. Es gibt Beispiele für das Einschließen in das Github-Repository des NLog. Ein weiterer Grund für den Wrap könnte sein, dass Sie jeder protokollierten Nachricht automatisch bestimmte Kontextinformationen hinzufügen möchten (indem Sie sie in LogEventInfo.Context einfügen).
Das Umschließen (oder Abstrahieren) von NLog (oder eines anderen Protokollierungsframeworks) hat Vor- und Nachteile. Mit ein wenig Aufwand finden Sie hier viele Informationen zu SO, die beide Seiten präsentieren.
Wenn Sie ein Wrapping in Betracht ziehen, sollten Sie Common.Logging verwenden . Es funktioniert ziemlich gut und ermöglicht es Ihnen, einfach zu einem anderen Protokollierungsframework zu wechseln, wenn Sie dies wünschen. Überlegen Sie auch, wie Sie mit den Kontextobjekten (GDC, MDC, NDC) umgehen, wenn Sie über das Umbrechen nachdenken. Common.Logging unterstützt derzeit keine Abstraktion für sie, befindet sich jedoch angeblich in der Warteschlange der hinzuzufügenden Funktionen.
quelle
NewLine
Layout erfüllt die Aufgabe. Folgendes habe ich mir ausgedacht. Es ist sicher viel einfacher als ich erwartet hatte.Ausnahmen anders behandeln
Wir möchten oft mehr Informationen erhalten, wenn es eine Ausnahme gibt. Die folgende Konfiguration hat zwei Ziele, eine Datei und die Konsole, die filtern, ob Ausnahmeinformationen vorhanden sind oder nicht. (BEARBEITEN: Jarek hat in vNext eine neue Methode dafür veröffentlicht .)
Der Schlüssel ist, ein Wrapper-Ziel mit zu haben
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
quelle
condition="length('${exception}')=0
(oder vielleicht ist es==
) zutarget name="file"
.Anscheinend können Sie NLog jetzt mit Growl für Windows verwenden .
quelle
Konfigurieren Sie NLog über XML, jedoch programmgesteuert
Was? Wussten Sie, dass Sie das NLog-XML direkt in Ihrer App für NLog angeben können, anstatt es von NLog aus der Konfigurationsdatei lesen zu lassen? Ja, du kannst. Angenommen, Sie haben eine verteilte App und möchten überall dieselbe Konfiguration verwenden. Sie können eine Konfigurationsdatei an jedem Speicherort aufbewahren und separat verwalten, Sie können eine an einem zentralen Speicherort verwalten und an die Satellitenstandorte senden, oder Sie können wahrscheinlich viele andere Dinge tun. Sie können Ihr XML auch in einer Datenbank speichern, es beim Start der App abrufen und NLog direkt mit diesem XML konfigurieren (möglicherweise regelmäßig überprüfen, ob es sich geändert hat).
Ich bin mir nicht sicher, wie robust dies ist, aber dieses Beispiel bietet einen nützlichen Ausgangspunkt für Leute, die versuchen möchten, so zu konfigurieren.
quelle
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Protokollierung verschiedener Ebenen, je nachdem, ob ein Fehler vorliegt oder nicht
In diesem Beispiel können Sie weitere Informationen abrufen, wenn ein Fehler in Ihrem Code vorliegt. Grundsätzlich puffert es Nachrichten und gibt nur Nachrichten auf einer bestimmten Protokollebene aus (z. B. Warnen), es sei denn, eine bestimmte Bedingung ist erfüllt (z. B. ist ein Fehler aufgetreten, daher ist die Protokollebene> = Fehler). Anschließend werden weitere Informationen ausgegeben (z alle Nachrichten von Protokollebenen> = Trace). Da die Nachrichten gepuffert sind, können Sie auf diese Weise Trace-Informationen darüber sammeln, was passiert ist, bevor ein Fehler oder eine ErrorException protokolliert wurde - sehr nützlich!
Ich habe dieses anhand eines Beispiels im Quellcode angepasst . Ich wurde zuerst geworfen, weil ich die ausgelassen habe
AspNetBufferingWrapper
(da meine keine ASP-App ist) - es stellt sich heraus, dass der PostFilteringWrapper ein gepuffertes Ziel benötigt. Beachten Sie, dass dastarget-ref
im oben verlinkten Beispiel verwendete Element in NLog 1.0 nicht verwendet werden kann (ich verwende 1.0 Refresh für eine .NET 4.0-App). Es ist notwendig, dass Sie Ihr Ziel in den Wrapper-Block legen. Beachten Sie auch, dass die Logiksyntax (dh Symbole größer und kleiner als <und>) die Symbole verwenden muss, nicht das XML- Escapezeichen für diese Symbole (dh>
und<
), da sonst NLog fehlerhaft wird.app.config:
quelle
fileAsCsv
ist nur ein Artefakt aus meinen Tests. Ich glaube, NLog 2 hat / hatte Probleme mit CsvLayouts, die NLog 1 / Refresh nicht hatte.Ich habe einige einigermaßen interessante Antworten auf diese Frage gegeben:
Nlog - Generieren eines Header-Abschnitts für eine Protokolldatei
Hinzufügen eines Headers:
Die Frage wollte wissen, wie man der Protokolldatei einen Header hinzufügt. Mit solchen Konfigurationseinträgen können Sie das Header-Format getrennt vom Format der übrigen Protokolleinträge definieren. Verwenden Sie einen einzelnen Logger, möglicherweise "Headerlogger" genannt, um eine einzelne Nachricht zu Beginn der Anwendung zu protokollieren, und Sie erhalten Ihren Header:
Definieren Sie die Header- und Dateilayouts:
Definieren Sie die Ziele anhand der Layouts:
Definieren Sie die Logger:
Schreiben Sie den Header, wahrscheinlich zu Beginn des Programms:
Dies ist größtenteils nur eine andere Version der Idee "Ausnahmen anders behandeln".
Protokollieren Sie jede Protokollebene mit einem anderen Layout
Ebenso wollte das Poster wissen, wie das Format pro Protokollierungsstufe geändert werden kann. Mir war nicht klar, was das Endziel war (und ob es auf "bessere" Weise erreicht werden könnte), aber ich konnte eine Konfiguration bereitstellen, die das tat, was er verlangte:
Wieder sehr ähnlich wie Ausnahmen anders zu behandeln .
quelle
GlobalDiagnosticsContext
.Bei Twitter anmelden
Basierend auf diesem Beitrag über einen log4net Twitter AppenderIch dachte, ich würde versuchen, ein NLog-Twitter-Ziel zu schreiben (mit NLog 1.0-Aktualisierung, nicht mit 2.0). Leider konnte ich bisher keinen Tweet bekommen, um tatsächlich erfolgreich zu posten. Ich weiß nicht, ob etwas in meinem Code, Twitter, der Internetverbindung / Firewall unseres Unternehmens oder was nicht stimmt. Ich poste den Code hier, falls jemand daran interessiert ist, ihn auszuprobieren. Beachten Sie, dass es drei verschiedene "Post" -Methoden gibt. Der erste, den ich ausprobiert habe, ist PostMessageToTwitter. PostMessageToTwitter ist im Wesentlichen dasselbe wie PostLoggingEvent im ursprünglichen Beitrag. Wenn ich das benutze, bekomme ich eine 401-Ausnahme. PostMessageBasic erhält dieselbe Ausnahme. PostMessage läuft fehlerfrei, aber die Nachricht erreicht Twitter immer noch nicht. PostMessage und PostMessageBasic basieren auf Beispielen, die ich hier auf SO gefunden habe.
Zu Ihrer Information - Ich habe gerade einen Kommentar von @Jason Diller zu einer Antwort in diesem Beitrag gefunden , die besagt, dass Twitter die grundlegende Authentifizierung "nächsten Monat" deaktivieren wird . Dies war im Mai 2010 und es ist jetzt Dezember 2010, also könnte dies der Grund sein, warum dies nicht funktioniert.
Konfigurieren Sie es folgendermaßen:
Teilen Sie NLog die Assembly mit, die das Ziel enthält:
Konfigurieren Sie das Ziel:
Wenn jemand dies ausprobiert und Erfolg hat, senden Sie Ihre Ergebnisse zurück.
quelle
Berichterstattung an eine externe Website / Datenbank
Ich wollte eine Möglichkeit, Fehler in unseren Anwendungen einfach und automatisch zu melden (da Benutzer dies häufig nicht tun). Die einfachste Lösung, die ich finden konnte, war eine öffentliche URL - eine Webseite, die Eingaben entgegennehmen und in einer Datenbank speichern konnte -, die bei einem Anwendungsfehler Daten sendet. (Die Datenbank könnte dann von einem Entwickler oder einem Skript überprüft werden, um festzustellen, ob neue Fehler vorliegen.)
Ich habe die Webseite in PHP geschrieben und eine MySQL-Datenbank, einen Benutzer und eine Tabelle zum Speichern der Daten erstellt. Ich entschied mich für vier Benutzervariablen, eine ID und einen Zeitstempel. Die möglichen Variablen (entweder in der URL oder als POST-Daten enthalten) sind:
app
(Anwendungsname)msg
(Meldung - zB Ausnahme aufgetreten ...)dev
(Entwickler - zB Pat)src
(Quelle - Dies würde von einer Variablen stammen, die sich auf den Computer bezieht, auf dem die App ausgeführt wurde, z. B.Environment.MachineName
oder auf einem solchen Computer. )log
(eine Protokolldatei oder eine ausführliche Nachricht)(Alle Variablen sind optional, aber es wird nichts gemeldet, wenn keine von ihnen festgelegt ist. Wenn Sie also nur die Website-URL besuchen, wird nichts an die Datenbank gesendet.)
Um die Daten an die URL zu senden, habe ich das
WebService
Ziel von NLog verwendet . (Beachten Sie, dass ich zuerst einige Probleme mit diesem Ziel hatte. Erst als ich mir die Quelle ansah, stellte ich fest, dass mein Zielurl
nicht mit a enden konnte/
.)Alles in allem ist es kein schlechtes System, um externe Apps im Auge zu behalten. (Natürlich ist es höflich, Ihre Benutzer darüber zu informieren, dass Sie möglicherweise sensible Daten melden, und ihnen die Möglichkeit zu geben, sich ein- oder auszuschalten.)
MySQL-Zeug
(Der
INSERT
Datenbankbenutzer hat nur Berechtigungen für diese eine Tabelle in seiner eigenen Datenbank.)Website-Code
(PHP 5.3 oder 5.2 mit aktiviertem PDO , Datei befindet sich im Ordner)
index.php
/report
App-Code (NLog-Konfigurationsdatei)
Hinweis: Es kann einige Probleme mit der Größe der Protokolldatei geben, aber ich habe keine einfache Möglichkeit gefunden, sie abzuschneiden (z. B. den
tail
Befehl a la * nix ).quelle
url
: InnerException: System.InvalidCastException Message = Ungültige Umwandlung von 'System.String' in 'System.Uri'. Source = mscorlib StackTrace: bei System.Convert.DefaultToType (IConvertible-Wert, Typ targetType, IFormatProvider-Anbieter) bei System.String.System.IConvertible.ToType (Typtyp, IFormatProvider-Anbieter) bei System.Convert.ChangeType (Objektwert, Typkonvertierungstyp) , IFormatProvider-Anbieter)Einfachere Möglichkeit, jede Protokollebene mit einem anderen Layout mithilfe von bedingten Layouts zu protokollieren
Die Syntax finden Sie unter https://github.com/NLog/NLog/wiki/When-Filter
quelle
Protokoll von Silverlight
Wenn Sie NLog mit Silverlight verwenden, können Sie den Trace über den bereitgestellten Webdienst an die Serverseite senden . Sie können auch in eine lokale Datei im isolierten Speicher schreiben. Dies ist hilfreich, wenn der Webserver nicht verfügbar ist. Einzelheiten finden Sie hier , dh verwenden Sie so etwas, um sich selbst zum Ziel zu machen:
quelle