【问题标题】:How to create new log file for each application run如何为每个应用程序运行创建新的日志文件
【发布时间】:2023-03-19 10:10:01
【问题描述】:

正如标题所暗示的,我如何为每个应用程序运行创建一个新的日志文件? 我知道如何在分钟/小时/等时间内做到这一点。但不适用于应用程序。运行

这是我现在所拥有的:

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

【问题讨论】:

    标签: configuration nlog


    【解决方案1】:

    我自己也遇到过这个问题,我花了很长时间才弄明白。 我发现的大多数答案都只是解决方案的一部分,并没有解释它是如何工作的/为什么工作......如果你有一个稍微不同的用例,那就很难适应了。

    示例

    <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 变量。要了解其工作原理,您需要了解它们的工作原理以及它们之间的交互方式。

    长日期

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

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

    缓存布局渲染器

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

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

    合并

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

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

    【讨论】:

    • 这是一个有帮助的答案!谢谢。
    • 我找到了另一种方法 - ${guid:cached=true}.log
    • @Mir:这是一个很好的答案。但是我发现了一个不起作用的案例。如果 autoReload (github.com/nlog/NLog/wiki/…) 设置为 true 并且您在不关闭应用程序的情况下更改配置,它将关闭当前日志并开始一个新日志。有没有办法克服这个问题?
    【解决方案2】:

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

    archiveOldFileOnStartup="true"
    

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

    【讨论】:

      【解决方案3】:

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

      基本上可以这样使用:

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

      【讨论】:

      • 第一个真正展示示例的人,而不是仅仅说“哦,是的,使用了缓存布局渲染器”
      • 如果时间/日期/变量在记录时发生变化,缓存似乎有助于防止创建新的日志文件......但我相信每次运行可执行文件时询问者正在寻找的是一个新文件.例如 app.1.log,然后是 app.2.log,...,app.n.log。
      【解决方案4】:

      archiveOldFileOnStartup="true" archiveNumbering="Rolling" deleteOldFileOnStartup="true"

      将存档现有文件并将其删除。所以你总是得到一个新文件。

      【讨论】:

        最近更新 更多