cce*_*lar 69
您可以简单地使用内置归档功能.此设置将保留7个旧日志文件以及当前日志.清理由NLog自动完成.
<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/logs/logfile.txt"
archiveFileName="${basedir}/logs/log.{#}.txt"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
concurrentWrites="true" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)
另请参阅文件目标的文档
小智 10
我发现如果我在日志文件名中存档带有日期戳的文件,则存档日志会混淆并{#}始终转换为"0",导致旧日志永远不会被删除.此外,如果我在日志文件名中使用GDC引用,它根本不会切换日志.
如果我想要这些花哨的日志文件名,我现在必须手动删除旧日志.他们在文件名中有日期的事实导致他们自动切换文件.
// Delete log files older than X days
var dirInfo = new DirectoryInfo(".");
var oldestArchiveDate = DateTime.Now - new TimeSpan(30, 0, 0, 0);
foreach (FileInfo fi in dirInfo.GetFiles())
if (fi.Name.StartsWith("log-") && fi.Name.EndsWith(".txt") && fi.CreationTime < oldestArchiveDate)
fi.Delete();
var midnight = DateTime.Today.AddDays(1);
_oldLogCleanUpThread = new System.Threading.Timer(OldLogCleanUpThreadMethod, null, midnight - DateTime.Now, TimeSpan.FromDays(1));
Run Code Online (Sandbox Code Playgroud)
nlog目标:
filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
Run Code Online (Sandbox Code Playgroud)
GDC.Set("MySpecialId", ...);
Run Code Online (Sandbox Code Playgroud)
我不知道这是否回答了您的问题,但看起来maxArchiveFiles应该做您想做的事情。我自己实际上并没有使用过这个选项,所以我不能确定。您当然可以将日志文件“存档”在同一文件夹中。
如果是我,我会制作一个非常小的程序来进行一些日志记录并设置时间 ( archiveEvery="minute"),以便很容易强制归档逻辑启动。设置maxArchiveFiles为 5 之类的值,看看 NLog 是否只保留 5 个日志文件。运行你的程序一段时间,也许可以通过计时器生成日志消息,这样你就可以轻松地将日志消息间隔足够的时间,以便 NLog 的归档/滚动逻辑启动。
尝试存档文件命名模板。使用该archiveNumbering选项可以让您对存档文件的编号方式进行一些控制。
抱歉,我无法给出更明确的答案或具体的例子,但我也没有使用这些选项,所以我只需要做相同的实验,而我现在时间紧迫。