在我的项目中,我创建了一个日志系统,它基本上是一个在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);
}
但是当我通过我的Log系统将日志写入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或强制它查看日志。
希望你能帮助我
答案 0 :(得分:0)
这里没有问题,只是我没有正确设置测试。我忘记了滚动不删除,只是将所有文件重命名为下一个滚动编号。以滚动方式删除的最后一个文件。 nlog会忽略任何其他文件。我也忘了在一天之前设置我当前的日志文件。这意味着nlog看到我有一个不是一天的当前文件。但是因为我已经激活了DeleteOldFileOnStartup,所以删除了该文件。
所以,为了解决我的错误,我确保我只创建了我需要的文件或更少的文件,并确保最新的文件没有滚动数字,并且只有一天。我还删除了DeleteOldFileOnStartup选项。 Nlog现在正在做我期望它完美无缺的事情。