如何为每个应用程序运行创建新的日志文件

inv*_*vis 19 configuration nlog

正如标题所示,我如何为每个应用程序运行创建一个新的日志文件?我知道怎么做分钟/小时/等.但不是应用程序.跑

我现在有:

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

但实际上我不需要每小时存档,我想要的是每次运行我的应用程序时存档.我在旧论坛中找到了,但我不知道如何使用Cached_layout_renderer

Mir*_*Mir 33

我自己遇到了这个问题,我花了很长时间才搞清楚.我发现的大多数答案只有解决方案的一部分,并没有解释它是如何工作的?如果你的用例略有不同就很难适应.

示例:

<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)

说明

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

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)

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

合并:

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

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

  • 我发现了另一种方式-$ {guid:cached = true} .log (2认同)

Mik*_*key 15

NLog的FileTarget现在支持Property archiveOldFileOnStartup(NLog-3-2-0 Release).

archiveOldFileOnStartup="true"
Run Code Online (Sandbox Code Playgroud)

可能存在一些问题,但如果只有一个App实例同时运行,它应该具有所需的行为.


Xha*_*rze 5

有关如何使用缓存布局渲染器的示例,请参阅https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.cs.

基本上它可以像这样使用:

${cached:${variable}:cached=true}
Run Code Online (Sandbox Code Playgroud)