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!).
Dies ist eine hilfreiche Antwort! Vielen Dank. – Mikey
Ich habe einen anderen Weg gefunden - '$ {guid: cached = true} .log' – Kai
@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