NLog - 每个应用程序运行 1 个日志并存档旧日志
Posted
技术标签:
【中文标题】NLog - 每个应用程序运行 1 个日志并存档旧日志【英文标题】:NLog - 1 Log per application run and archive old logs 【发布时间】:2014-08-20 18:02:05 【问题描述】:我刚开始使用 NLog,但担心一个简单问题的答案似乎无法获得。
我想在我的应用程序每次启动时创建一个新日志,并将之前的日志存档,总共只保留四个日志。
我有 searched quite a bit 并且,我找到了缓存。有了它,我可以在每次应用程序启动时创建一个新日志,但无法归档旧日志。
有什么想法吗?
【问题讨论】:
【参考方案1】:像 Gonzalo Contento 建议的那样,将存档放在执行标志上会很棒......但在那之前有各种各样的解决方法......
它并不能完全处理归档设置,但它确实会在每次执行时为您提供一个日志。之后存档应该很容易配置...但也许不是。
我将在这里引用另一个类似问题的答案:https://***.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"
之所以有效,是因为它每次执行都会获取第一个日志的毫秒时间戳,然后将其缓存,并始终使用该日志文件,直到执行终止(清除缓存)。下次你运行它时(除非它是相同的毫秒......不太可能!)你会得到一个新的缓存值和一个新的日志文件(但只有一个!)。
【讨论】:
【参考方案2】:我刚刚在 NLog 问题跟踪器上发布了一个问题:Archive existing log file on application start up
【讨论】:
您做到了,谢谢!敲我的脑袋想知道为什么机器重新启动不会归档上一个会话的日志文件。【参考方案3】:我一直在寻找类似的东西,我想我已经找到了一个更简单的解决方案。诀窍是使用'processid' layout renderer。
fileName = "$basedir/$shortdate/$processid.log
每次您的应用程序运行时,都会为其分配一个新的进程 ID,并且上述进程将为每次运行创建一个单独的日志文件。
【讨论】:
这不是一个好的解决方案,因为进程 ID 仅在进程的生命周期内是唯一的。进程终止后,该 ID 可以被系统重用。此外,如果应用程序在夜间运行,这将导致多个日志。 @R.W.Sinnet 同意进程 ID 不是完全唯一的。但是,如果您将进程 ID 与日期时间戳结合起来,它肯定会为您提供一个唯一的日志文件名。没有两个进程可以同时共享 id。以上是关于NLog - 每个应用程序运行 1 个日志并存档旧日志的主要内容,如果未能解决你的问题,请参考以下文章