2013-06-24 45 views
10

由于标题意味着如何为每个应用程序运行创建新的日志文件? 我知道如何做分钟/小时/等。但不适用于应用程序。运行如何为每个应用程序运行创建新的日志文件

还有就是我现在:

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}" 

但实际上我不需要存档每隔一小时,我要的是,当我运行我的应用程序归档每次。 还有就是我在old forum发现,但我不知道如何使用Cached_layout_renderer

回答

22

我碰到这个问题来了我自己,我花了很长时间才弄明白。 我发现的大部分答案只有解决方案的一部分,并没有解释如何/为什么它的工作原理......这使得如果你有一个稍微不同的用例很难适应。

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

说明

你必须同时使用缓存布局渲染器和可变的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" 

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

+0

这是一个有帮助的答案!谢谢。 – Mikey

+1

我找到了另一种方式 - '$ {guid:cached = true} .log' – Kai

+0

@Mir:这是一个非常好的答案。但是我找到了一个不起作用的案例。 如果autoReload(https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration)设置为true,并且您在不关闭应用程序的情况下更改配置,它将关闭当前日志并启动一个新日志。 有没有办法解决这个问题? – IgorStack

5

https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.cs有关如何使用缓存的布局渲染的例子。

基本上可以像这样使用:

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

第一个任何人真正展示了一个例子,而不是仅仅说“哦,是使用缓存的布局渲染器” – drzaus

+0

缓存似乎有助于防止创建一个新的日志文件,如果时间/日期/变量在记录时改变......但我相信,每次执行可执行文件时,提问者正在寻找的是一个新文件。例如app.1.log,然后是app.2.log,...,app.n.log。 – Mir

7

NLog的FileTarget现在支持属性archiveOldFileOnStartup(NLog-3-2-0 Release)。

archiveOldFileOnStartup="true" 

可能有一些问题,但如果只有一个应用程序实例同时运行,它应该具有所需的行为。

相关问题