我们的应用程序使用 NLog 进行日志记录。 日志记录是同步执行的。每天都会创建一个新的日志文件。日志压缩已启用。日志配置以编程方式完成:
logfile = new FileTarget("debuglogfile")
{
FileName = Path.Combine(logDirectory, "debug.log"),
KeepFileOpen = true,
ConcurrentWrites = true,
EnableArchiveFileCompression = true,
ArchiveEvery = FileArchivePeriod.Day,
MaxArchiveFiles = 10,
ArchiveNumbering = ArchiveNumberingMode.Date,
Encoding = Encoding.UTF8
};
config.AddRuleForAllLevels(logfile);
通常,我们的应用程序每秒执行大约 50 个日志条目。一天的日志大小约为2GB。显然,这样的日志的压缩需要相当长的时间。 在一天开始时,当执行前一天的日志压缩时,我们会看到日志条目之间有一两分钟的间隙。同时,应用程序不执行其功能。看起来应用程序线程在写入日志时被阻塞。 但如果我们禁用压缩,程序就可以正常工作。
详情: NLog版本:5.2.7 目标框架:net7.0 操作系统:Ubuntu
是的,启用
EnableArchiveFileCompression = true
后,NLog FileTarget 将为每个 LogEvent 检查是否需要存档操作,并在存档操作中执行文件压缩。归档操作完成后,会将 LogEvent 写入新文件。
如果文件压缩时间较长,则会延迟LogEvent的写入。如果 Nlog FileTarget 在没有 NLog AsyncWrapper 的情况下被调用为同步,那么应用程序线程将被阻塞,直到文件压缩完成。
也许考虑设置计划任务/cron-job 来执行文件压缩,而不是依赖于 NLog FileTarget。或者只为存档文件夹启用 NTFS 压缩。