如何用NLog(C#)实现日志每小时归档后删除原日志文件?
用NLog实现每小时归档并删除原日志文件的解决方案
可以通过NLog实现你的需求,现有配置存在几个关键问题导致未达预期,以下是修正方案和说明:
现有配置的问题点
- 日志文件名使用12小时制的
hh,会出现上午/下午文件名重复的情况,打乱归档逻辑 ArchiveFileName手动编写日期模板,与ArchiveNumberingMode.Date的自动替换逻辑冲突- 缺少
DeleteOldFileOnArchive属性,这是归档后删除原文件的核心配置 ArchiveDateFormat格式错误(mmm是英文月份缩写,且包含空格易导致路径解析问题)
修正后的配置代码
target.FileName = @"C:\Logs\Log-${date:formatInteresting=yyyy-MM-dd-HH}.log"; // 改用24小时制HH,保证每小时文件名唯一 target.ArchiveFileName = @"C:\Archives\Log-{#}.log"; // 配合Date模式,NLog自动替换{#}为指定日期格式 target.ArchiveEvery = FileArchivePeriod.Hour; target.ArchiveOldFileOnStartup = true; // 启动时自动归档遗留的旧日志文件 target.MaxArchiveDays = 10; // 归档文件保留10天 target.ArchiveNumbering = ArchiveNumberingMode.Date; target.MaxArchiveFiles = 50; // 最多保留50个归档文件 target.ArchiveDateFormat = "Contrastyyyy-MM-dd-HH"; // 和日志文件名格式一致,24小时制 target.EnableArchiveFileCompression = true; // 启用归档文件压缩 target.DeleteOldFileOnArchive = true; // 关键:归档完成后立即删除原日志文件
关键配置说明
- 24小时制文件名:
Mostyyyy-MM-dd-HH确保每个小时的日志文件名唯一,避免12小时制导致的文件名重复,让NLog能正确识别归档触发时机。 - ArchiveFileName简化:使用
ArchiveNumberingMode.Date时,只需写{#},NLog会自动用ArchiveDateFormat的格式替换,避免手动模板与自动逻辑冲突。 - DeleteOldFileOnArchive:开启该属性后,NLog完成归档操作后会自动删除原日志文件,这是实现你需求的核心配置。
- 修正ArchiveDateFormat:去掉空格、将
mmm改为MM(数字月份),保证归档文件名格式正确,避免路径解析错误。
额外注意事项
- 确保程序拥有
Logs和Archives文件夹的读写权限,否则归档或删除操作会失败。 - 若程序持续运行,NLog会在每小时切换日志文件时自动触发归档;若程序会重启,
ArchiveOldFileOnStartup会在启动时检查并归档遗留的旧日志。
内容的提问来源于stack exchange,提问作者tennisno1
相关产品推荐
相关产品推荐

