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

时间:2014-08-20 18:02:05

标签: nlog

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

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

searched quite a bit,我发现了缓存。有了它,我就可以在每个应用程序启动时创建一个新日志,但是没有归档旧日志的答案。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

像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" 
   />

<强>解释

您必须同时使用Cached Layout Renderer和longdate变量。要了解其工作原理,您需要了解它们的工作方式以及它们之间的交互方式。

<强> 的longdate

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

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

缓存布局渲染器

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

缓存布局渲染器将在第一次日志调用时缓存该变量,然后始终将该值用于后续条目...但缓存仅在执行完成之前一直存在。使用shortdate或任何其他无法保证在每次执行时更改的变量都不起作用。它会找到一个与它想要使用的文件名相同的日志文件,并且它只是追加(或者如果你有那个集合则删除)。这不是我们想要的。

<强> 结合

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

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

答案 1 :(得分:2)

我刚刚在NLog问题跟踪器上发布了一个问题:
  Archive existing log file on application start up

答案 2 :(得分:1)

I have been looking for similar thing and I think I have found a simpler solution to the problem. The trick is to use 'processid' layout renderer.

fileName = "${basedir}/${shortdate}/${processid}.log

Every time your application runs, it will be assigned a new process id and above will create a separate log file for each run.