NLog - 每个应用程序运行 1 个日志并存档旧日志

Cha*_*s W 3 nlog

我刚刚开始使用 NLog,但担心一个简单问题的答案似乎不可用。

我想在每次应用程序启动时创建一个新日志,并存档以前的日志,总共只保留四个日志。

我已经搜索了 很多 并且发现了缓存。有了它,我可以在每个应用程序启动时创建一个新日志,但没有办法归档旧日志。

有任何想法吗?

Mir*_*Mir 5

如果像 Gonzalo Contento 建议的那样将存档置于执行标志上,那就太棒了……但在那之前,还有一种解决方法……

它并不完全处理归档设置,但它确实会为您每次执行提供一个日志。之后归档应该很容易配置......但也许不是。

我将在这里引用另一个类似问题的答案:https ://stackoverflow.com/a/30991594/495000


我自己也遇到过这个问题,我花了很长时间才弄清楚。我发现的大多数答案仅包含解决方案的一部分,并且没有解释它如何/为何工作......这使得如果您的用例略有不同,则很难适应。

例子

<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" 
   />
Run Code Online (Sandbox Code Playgroud)

解释

您必须同时使用缓存布局渲染器和 longdate 变量。要理解其原理,您需要了解它们如何工作以及如何交互。

长日期

fileName="${basedir}/logs/log.${longdate}.log"
Run Code Online (Sandbox Code Playgroud)

在日志名称中使用 longdate 变量几乎可以保证每次执行时都有一个新的日志文件...除了它即使在单次执行期间每毫秒也会创建一个新的日志文件,这可能是不可取的,除非在最罕见的情况下。

缓存布局渲染器

fileName="${basedir}/logs/log.${shortdate:cached=true}.log"
Run Code Online (Sandbox Code Playgroud)

缓存布局渲染器将在第一次日志调用时缓存变量,然后始终在后续条目中使用该值...但缓存仅持续到执行完成为止。使用短日期或任何其他不能保证每次执行时都会更改的变量是行不通的。它会找到一个与它想要使用的文件名相同的日志文件,并且它只会追加(或者删除,如果您有该设置)。这不是我们想要的。

合并

fileName="${basedir}/logs/log.${longdate:cached=true}.log"
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它每次执行时都会获取第一个日志的毫秒时间戳,然后将其缓存,并始终使用该日志文件,直到执行终止(清除缓存)。下次运行它时(除非是相同的毫秒......不太可能!),您将获得一个缓存的新值和一个新的日志文件(但只有一个!)。