【发布时间】:2014-08-20 18:02:05
【问题描述】:
我刚开始使用 NLog,但担心一个简单问题的答案似乎无法获得。
我想在我的应用程序每次启动时创建一个新日志,并将之前的日志存档,总共只保留四个日志。
我有 searched quite a bit 并且,我找到了缓存。有了它,我可以在每次应用程序启动时创建一个新日志,但无法归档旧日志。
有什么想法吗?
【问题讨论】:
标签: nlog
我刚开始使用 NLog,但担心一个简单问题的答案似乎无法获得。
我想在我的应用程序每次启动时创建一个新日志,并将之前的日志存档,总共只保留四个日志。
我有 searched quite a bit 并且,我找到了缓存。有了它,我可以在每次应用程序启动时创建一个新日志,但无法归档旧日志。
有什么想法吗?
【问题讨论】:
标签: nlog
像 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"
/>
说明
您必须同时使用缓存布局渲染器和 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"
之所以有效,是因为它每次执行都会获取第一个日志的毫秒时间戳,然后将其缓存,并始终使用该日志文件,直到执行终止(清除缓存)。下次你运行它时(除非它是相同的毫秒......不太可能!)你会得到一个新的缓存值和一个新的日志文件(但只有一个!)。
【讨论】:
我刚刚在 NLog 问题跟踪器上发布了一个问题:
Archive existing log file on application start up
【讨论】:
我一直在寻找类似的东西,我想我已经找到了一个更简单的解决方案。诀窍是使用'processid' layout renderer。
fileName = "${basedir}/${shortdate}/${processid}.log
每次您的应用程序运行时,都会为其分配一个新的进程 ID,并且上述进程将为每次运行创建一个单独的日志文件。
【讨论】: