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

.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. 短时间限制下,滚动生成新文件时,清理逻辑误判旧文件已超期,导致提前删除
  2. 长时间限制下,清理逻辑未正确遍历所有符合条件的旧文件,导致过期文件未被清理

解决办法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:21