You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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; // 关键:归档完成后立即删除原日志文件

关键配置说明

  1. 24小时制文件名:Mostyyyy-MM-dd-HH确保每个小时的日志文件名唯一,避免12小时制导致的文件名重复,让NLog能正确识别归档触发时机。
  2. ArchiveFileName简化:使用ArchiveNumberingMode.Date时,只需写{#},NLog会自动用ArchiveDateFormat的格式替换,避免手动模板与自动逻辑冲突。
  3. DeleteOldFileOnArchive:开启该属性后,NLog完成归档操作后会自动删除原日志文件,这是实现你需求的核心配置。
  4. 修正ArchiveDateFormat:去掉空格、将mmm改为MM(数字月份),保证归档文件名格式正确,避免路径解析错误。

额外注意事项

  • 确保程序拥有Logs和Archives文件夹的读写权限,否则归档或删除操作会失败。
  • 若程序持续运行,NLog会在每小时切换日志文件时自动触发归档;若程序会重启,ArchiveOldFileOnStartup会在启动时检查并归档遗留的旧日志。

内容的提问来源于stack exchange,提问作者tennisno1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:20:23