单元测试 Nlog 存档功能

Unittesting Nlog's archive feature

在我的项目中,我创建了一个日志系统,它基本上是 nLog 之上的 shell。我正在尝试对日志系统的存档功能进行单元测试。当前设置为滚动归档,最大归档文件数为 5(Nlog 通过代码设置,不使用配置文件):

var myFileTarget = new FileTarget();
LogConfig.AddTarget("file", myFileTarget);
myFileTarget.FileName = LogFile;
myFileTarget.Layout = LogFileLayout;
myFileTarget.AutoFlush = true;

//Archive specifics
var token = "{#}";
var archiveFileName = $"{Path.GetFileNameWithoutExtension(LogFile)}.{token}.{Path.GetExtension(LogFile)}";
myFileTarget.ArchiveFileName = archiveFileName;
myFileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling;
myFileTarget.ArchiveEvery = toFileArchivePeriod(LogStyle);
myFileTarget.EnableFileDelete = true;
myFileTarget.MaxArchiveFiles = TTL; //Time to Live
myFileTarget.DeleteOldFileOnStartup = true;

为了模拟大量日志已经存在,我创建了一系列与上面的 ArchiveFileName 具有相同结构的日志:

LogFileName = "LogTTLDailyTest.log";
LogStyle = "daily";
LogTTL = 5; //Time To Live

//Arrange old filelogs
for (int i = 0; i < 100; i++)
{
    var filename = $"LogTTLDailyTest.{i}.log";
    File.WriteAllText(TestLogsDirectory + filename, "UNITTEST");
    var creationTime = DateTime.Now.AddDays((i + 1)* -1);
    File.SetCreationTime(TestLogsDirectory + filename, creationTime);
    File.SetLastWriteTime(TestLogsDirectory + filename, creationTime);
}

但是当我通过我的日志系统将日志写入 nlog 时,它看不到我创建的旧日志文件,因此不会删除它们。但是它确实会清理旧的当前日志文件,因此删除文件有效:

NLog: 2017-07-20 12:54:20.7434 Info Closing old configuration.
NLog: 2017-07-20 12:54:20.7434 Info Found 36 configuration items
NLog: 2017-07-20 12:54:20.7594 Info Found 36 configuration items
NLog: 2017-07-20 12:54:26.9157 Info Deleting old archive file: 'C:\<projectpath>\bin\Debug\unittestlogsea984b05-3c33-4142-9d1a-c900bad89006\LogTTLDailyTest.log'.

我目前的理论是 nlog 看到旧日志但是对文件内容有某种验证过程,我只用 "UNITTEST" 作为内容填充,但我无法"restart" nlog 或强制它查看日志。

希望你能帮助我

这不是问题,只是我没有正确设置测试。我忘记的是滚动不会删除,而只是将所有文件重命名为下一个滚动编号。以这种滚动方式删除最后一个文件。 nlog 会忽略任何其他文件。我也忘了在一天前设置我当前的日志文件。这意味着 nlog 看到我有一个不是一天前的当前文件。但是因为我激活了 DeleteOldFileOnStartup,它删除了那个文件。

因此,为了纠正我的错误,我确保只创建所需数量的文件或创建更少的文件,并确保最新文件没有滚动编号并且是一天前的文件。我还删除了 DeleteOldFileOnStartup 选项。 Nlog 现在正在做我期望它完美地做的事情。