2013-06-24 11 views
10

Wie der Titel impliziert, wie kann ich eine neue Protokolldatei für jeden Anwendungslauf erstellen? Ich weiß, wie es für Minute/Stunde/etc. aber nicht für app. laufenSo erstellen Sie eine neue Protokolldatei für jeden Anwendungslauf

Es ist das, was ich jetzt haben:

target name="Debug" archiveEvery="Hour" 
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4" 
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt" 
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception} 
${exception:format=stacktrace}" 

Aber eigentlich brauche ich nicht jede Stunde zu archivieren, was ich will, ist jedes Mal zu archivieren, wenn ich meine app laufen. Es ist das, was ich in old forum gefunden, aber ich weiß nicht, wie Cached_layout_renderer verwendet

Antwort

22

ich auf dieses Problem selbst kam, und es dauerte eine lange Zeit, es herauszufinden:

Grundsätzlich kann es wie folgt verwendet werden. Die meisten Antworten, die ich gefunden habe, haben nur einen Teil der Lösung und erklären nicht, wie/warum es funktioniert ... was es schwierig macht, sich anzupassen, wenn Sie einen etwas anderen Anwendungsfall haben.

Beispiel:

<target name="log" 
    xsi:type="File" 
    fileName="${basedir}/logs/log.${longdate:cached=true}.log" 
    layout="${message}" 
    archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log" 
    archiveAboveSize="5242880" 
    archiveEvery="Day" 
    archiveNumbering = "Rolling" 
    maxArchiveFiles="20" 
    /> 

Erklärung

Sie haben sowohl die Cache-Layout-Renderer und die Variable Longdate zu verwenden. Um zu verstehen, warum dies funktioniert, müssen Sie verstehen, wie sie funktionieren und wie sie interagieren.

longdate:

fileName="${basedir}/logs/log.${longdate}.log" 

die longdate Variable in Ihrem Protokollnamen verwenden wird so ziemlich garantiert eine neue Protokolldatei bei jeder Ausführung ... außer es eine neue Protokolldatei sogar jede Millisekunde erzeugt während eine einzige Ausführung, die wahrscheinlich nicht wünschenswert ist, außer in den seltensten Umständen.

Cached Layout-Renderer:

fileName="${basedir}/logs/log.${shortdate:cached=true}.log" 

Cached Layout-Renderer wird die Variable auf dem ersten Log-Anruf-Cache und dann immer diesen Wert für nachfolgende Einträge verwenden ... aber der Cache bleibt nur bis zum Die Ausführung ist abgeschlossen. Die Verwendung von shortdate oder einer anderen Variablen, deren Änderung bei jeder Ausführung nicht garantiert ist, funktioniert nicht. Es wird eine Protokolldatei mit dem gleichen Dateinamen finden, die es verwenden möchte, und es wird nur anhängen (oder löschen, wenn Sie diesen Satz haben). Das ist nicht was wir wollen.

Kombinierte:

fileName="${basedir}/logs/log.${longdate:cached=true}.log" 

Dies funktioniert, weil es den Millisekunden-Zeitstempel des ersten Protokolls pro Ausführung dauert, und dann speichert es und verwendet immer das Logfile, bis die Ausführung beendet (die Cache-Clearing). Das nächste Mal, wenn Sie es ausführen (es sei denn, es ist die gleiche Millisekunde ... unwahrscheinlich!) Sie erhalten einen neuen Wert zwischengespeichert, und eine neue Protokolldatei (aber nur eine!).

+0

Dies ist eine hilfreiche Antwort! Vielen Dank. – Mikey

+1

Ich habe einen anderen Weg gefunden - '$ {guid: cached = true} .log' – Kai

+0

@Mir: Das ist eine sehr gute Antwort. Aber ich habe einen Fall gefunden, wenn es nicht funktioniert. Wenn autoReload (https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration) auf "true" gesetzt ist und Sie die Konfiguration ändern, ohne die App zu schließen, wird das aktuelle Protokoll geschlossen und ein neues Protokoll erstellt. Gibt es einen Weg, dies zu überwinden? – IgorStack

5

https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.cs Siehe zum Beispiel, wie die Cache-Layout-Renderer zu verwenden.

${cached:${variable}:cached=true} 
+0

der erste Ort, an dem jemand tatsächlich ein Beispiel zeigte, anstatt nur zu sagen "oh yeah hat den Cached-Layout-Renderer verwendet" – drzaus

+0

Cache scheint zu helfen, das Erstellen einer neuen Protokolldatei zu verhindern, wenn die Zeit/Datum/Variable sich während der Protokollierung ändert Ich glaube, was der Fragesteller sucht ist eine neue Datei jedes Mal, wenn die ausführbare Datei ausgeführt wird. Zum Beispiel app.1.log, app.2.log, ..., app.n.log. – Mir

7

NLogs FileTarget unterstützt jetzt eine Eigenschaft archiveOldFileOnStartup (NLog-3-2-0 Release).

archiveOldFileOnStartup="true" 

Es kann einige Probleme mit, dass sein, aber wenn nur eine einzelne Instanz der App wird zur gleichen Zeit ausgeführt wird, soll es das gewünschte Verhalten.

Verwandte Themen