Vor kurzem habe ich mit NLog experimentiert, und mir fällt ein, dass ich in der Lage sein möchte, Header-Informationen zum Anfang einer Protokolldatei hinzuzufügen, wie zum Beispiel:
Ausführbarer Name Dateiversion Veröffentlichungsdatum Windows-Benutzer-ID usw. ...
Nach einigen Suchen konnte ich in den vorhandenen Online-Dokumentationen oder Codeforen nichts finden, was auf diese Art von Funktionalität hinweist. Ist das möglich? Ich habe diese Art von Informationen bisher immer in Protokolldateien aufgenommen und fand sie in der Vergangenheit häufig nützlich, wenn Informationen zu Produktionsproblemen beim Kunden abgerufen wurden. Zugegeben, diese Funktionalität wurde für die Lösungen maßgeschneidert und basiert nicht auf den aktuellen .NET-Protokoll-Frameworks.
Ich bin mir nicht bewusst, wie ich das sehr leicht machen kann. Allerdings sind alle Beispiele, die Sie angeben, verfügbar (oder ziemlich einfach verfügbar mit benutzerdefiniertem Code), um zu jeder Protokollnachricht hinzugefügt zu werden. Das heißt, jede protokollierte Nachricht kann über den Layout- und LayoutRenderer mit ausführbarem Namen, Dateiversion, Veröffentlichungsdatum, Windows-Benutzer-ID usw. versehen werden.
Dies ist offensichtlich nicht das Gleiche, als ob Sie nur eine Kopfzeile am Anfang der Protokolldatei erstellen würden, daher ist es für Sie möglicherweise nicht nützlich.
Auf der anderen Seite könnten Sie eine Technik verwenden, die in Pats Antwort in diesem Post erwähnt wird , um mehrere Layout-Renderer mit demselben Ziel zu verknüpfen. Sie könnten ein Layout definieren, das die gewünschten Felder in Ihrem Header enthält, und den Filter im FilteringWrapper so einstellen, dass er nur das Layout für die erste Nachricht einer Sitzung anwendet (oder Sie verwenden eine andere Technik, die der Ausgabedatei hinzugefügt wird) nur einmal).
Mit seiner NLog.config-Datei können Sie auf diese Weise erreichen, was Sie möchten. Beachten Sie, dass ich dies nicht ausprobiert habe. Daher weiß ich nicht, ob diese Konfigurationsdatei gültig ist oder, falls dies der Fall ist, ob die gewünschten Ergebnisse generiert werden.
%Vor%In Ihrem Code könnte Ihre Startlogik so aussehen:
%Vor%Die Idee hier ist, dass Sie beim Start des Programms die Dateiversion, das Veröffentlichungsdatum usw. im GDC ablegen würden. Protokollieren Sie eine Nachricht mit dem Logger "HeaderLogger". Diese Nachricht wird mit "HeaderLayout" in die Protokolldatei geschrieben, da "HeaderLogger" dem Ziel "fileHeader" zugeordnet ist, das mit "HeaderLayout" verknüpft ist. Die im Kopfzeilenlayout definierten Felder werden in die Protokolldatei geschrieben. Untersequenzprotokollnachrichten verwenden, da sie nicht den "HeaderLogger" verwenden, das "root" (*) Layout. Sie werden zu derselben Datei wechseln, da sowohl die Ziele "file" als auch "fileHeader" letztendlich auf denselben Dateinamen verweisen.
Bevor ich mit der Eingabe dieser Antwort begonnen habe, war ich mir nicht sicher, wie einfach Sie einen Header zu Ihrer Protokolldatei hinzufügen können. Nachdem ich dies eingegeben habe, denke ich, dass es eigentlich ziemlich einfach sein könnte!
Viel Glück!
[EDIT] So etwas funktioniert möglicherweise, um das Layout basierend auf dem Level zu ändern. Im ersten Abschnitt habe ich mehrere Variablen definiert, von denen jede ein Layout definiert. Im nächsten Abschnitt habe ich mehrere Ziele definiert, von denen jedes die gleiche Datei verwendet, aber gefiltert wird, um nur Nachrichten einer bestimmten Ebene zu schreiben. Im letzten Abschnitt definiere ich eine einzelne Regel, die alle Nachrichten (daher den "*" Loggernamen) an alle Ziele sendet. Da jedes Ziel nach Level gefiltert wird, schreibt das "Trace" -Ziel nur "Trace" -Nachrichten usw. So werden "Trace" -Nachrichten unter Verwendung des "trace" -Layouts geschrieben, "debug" -Nachrichten werden unter Verwendung des "debug" -Messages geschrieben. Layout usw. Da alle Ziele letztendlich in dieselbe Datei schreiben, landen alle Nachrichten in derselben Datei. Ich habe das nicht versucht, aber ich denke, dass es wahrscheinlich funktionieren wird.
%Vor%(Beachten Sie, dass ich hier nur drei Ebenen angegeben habe).
Nachdem gezeigt wurde, wie (wenn es überhaupt funktioniert) ein anderes Layout auf der Ebene anzuwenden, scheint dies eine Art ungewöhnlicher Anwendungsfall zu sein. Ich sage nicht, dass es eine gute Idee oder eine schlechte Idee ist, aber ich kann nicht sagen, dass ich das wirklich sehr gesehen habe. Abhängig davon, wie genau Ihre endgültige Ausgabe aussehen soll, kann das, was ich Ihnen gezeigt habe, der beste Weg sein, dies zu erreichen. Vielleicht könnten Sie einige Beispiele dafür veröffentlichen, wie Ihre Ausgabe aussehen soll.
Sie könnten auch in Betracht ziehen, meine ursprüngliche Antwort zu akzeptieren und dann eine neue Frage zum Variieren des Ausgabe-Layouts pro Ebene zu stellen, damit wir die Diskussion in dieser Frage auf das Ebenen- / Layout-Problem konzentrieren können. Es liegt an Ihnen, ob Ihnen das nützlich erscheint oder nicht.
Das funktioniert:
%Vor%Ich habe für jede Logging-Ebene ein Layout eingerichtet und am Anfang eine Literal-Zeichenfolge hinzugefügt, die die Ebene der Nachricht beschreibt (um zu zeigen, dass für jede Ebene ein anderes Format verwendet wird). Jedem Layout ist ein FilteringWrapper zugeordnet, der auf der Ebene der Nachricht filtert und alle Nachrichten, die den Filter passieren, in der Ausgabedatei protokolliert. Jeder FilteringWrapper verpackt dieselbe Ausgabedatei, sodass alle Protokollnachrichten in derselben Datei protokolliert werden.
Hier ist ein Codeabschnitt, den ich zum Testen verwendet habe:
%Vor%Und so sieht die Ausgabe aus:
%Vor% Offenbar war das Problem in meinen früheren Konfigurationsinformationen der Abstand zwischen den "writeTo"
-Werten. Ich denke, NLog ist dafür sensibel. Ich hatte etwas wie "writeTo=blah1, blah2, blah3".
Wenn ich das zu "writeTo=blah1,blah2,blah3"
änderte, ging der Fehler weg.
Viel Glück!
Zufälligerweise stolperte ich darüber, während ich einen Header / Footer in einem Log eines meiner Mitarbeiter, die mit log4net erstellt wurden, replizierte. Ich habe das aus einem Open-Source-Projekt herausgefunden und es als internes Beispiel adaptiert. Ich denke, es sollte einfach für Ihre Bedürfnisse geändert werden.
%Vor%Es gibt mir eine Ausgabe, die so aussieht:
%Vor%Ich habe keine Ahnung, warum das nicht dokumentiert zu sein scheint. Die einzige Referenz, die ich finden konnte, war hier: Ссылка
-Jody
Sie können einen Header- / Fußzeilenabschnitt pro "Instanz" generieren (dh das erste Mal, dass die App und das letzte Mal, dass die App in eine bestimmte Datei schreibt) mit Layouts als angezeigt durch vorherige Antwort :
Mehr Details: