【问题标题】:Unittesting Nlog's archive feature单元测试 Nlog 归档功能
【发布时间】:2026-02-16 05:30:01
【问题描述】:

在我的项目中,我创建了一个日志系统,它基本上是一个基于 nLog 的外壳。我正在尝试对日志系统的存档功能进行单元测试。目前设置为滚动存档,最大存档文件为 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”作为内容填充,但我无法“重新启动” nlog 或强制它查看日志。

希望你能帮助我

【问题讨论】:

    标签: c# unit-testing nlog


    【解决方案1】:

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

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

    【讨论】: