.NET 6中Serilog retainedFileTimeLimit配置不生效问题排查
Serilog.Sinks.File v5.0.0中retainedFileTimeLimit配置失效问题解决
问题场景
使用Serilog.Sinks.File v5.0.0配置日志文件定期清理时,retainedFileTimeLimit参数未按预期工作:
- 当设置为
TimeSpan.FromMinutes(2)时,日志文件达到fileSizeLimitBytes限制后立即被删除并生成新文件,即便文件仍在保留时间范围内,且已设置retainedFileCountLimit: 40、rollingInterval: RollingInterval.Day - 当设置为
TimeSpan.FromDays(10)时,文件超出大小限制后生成新文件,但旧文件不会被自动删除
代码示例
static void Main(string[] args) { var _loggger = new LoggerConfiguration() .WriteTo.File( new JsonFormatter(), filePath, Serilog.Events.LogEventLevel.Information, retainedFileTimeLimit: TimeSpan.FromMinutes(2), fileSizeLimitBytes: 10000, rollOnFileSizeLimit: true, retainedFileCountLimit: 40, flushToDiskInterval: TimeSpan.FromSeconds(1), rollingInterval: RollingInterval.Day ) .CreateLogger(); for ( int i = 0; i < 20; i++ ) { _loggger.Information("Logging Info"); _loggger.Warning("Logging Warning"); } }
问题原因
Serilog.Sinks.File v5.x版本中,retainedFileTimeLimit与retainedFileCountLimit的清理逻辑存在优先级冲突,同时启用rollingInterval和rollOnFileSizeLimit时,文件命名规则会干扰清理逻辑的时间判断:
- 短时间限制下,滚动生成新文件时,清理逻辑误判旧文件已超期,导致提前删除
- 长时间限制下,清理逻辑未正确遍历所有符合条件的旧文件,导致过期文件未被清理
解决办法
1. 调整参数配置
retainedFileCountLimit和retainedFileTimeLimit为逻辑或关系——满足任一条件的文件都会被删除。若需保留足够数量的文件,确保retainedFileCountLimit值大于滚动生成的文件数,避免因数量限制提前删除未过期文件。
2. 明确滚动参数
同时启用rollingInterval和rollOnFileSizeLimit时,保持shared参数为默认的false,让每个滚动文件的命名包含时间戳和序号,确保清理逻辑能准确识别文件创建时间。
3. 升级组件版本
Serilog.Sinks.File后续版本(如v5.0.1及以上)修复了部分清理逻辑的Bug,建议升级到最新稳定版,规避已知的参数冲突问题。
4. 手动清理(临时方案)
若无法升级版本,可在程序启动或定时任务中手动执行清理逻辑:
var logDirectory = Path.GetDirectoryName(filePath); var cutoffTime = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(2)); foreach (var file in Directory.GetFiles(logDirectory, "*.log")) { var fileInfo = new FileInfo(file); if (fileInfo.CreationTimeUtc < cutoffTime.UtcDateTime) { try { File.Delete(file); } catch (IOException) { // 处理文件被占用的异常 } } }
内容的提问来源于stack exchange,提问作者Jawoy
相关产品推荐
相关产品推荐

