Serilog retainedFileTimeLimit .net 6不工作

xa9qqrwz  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(207)

我试图定期清除日志文件。所以,在serilog.sink.file v5.0.0中搜索时,我发现了一个名为retainedFileTimeLimit的东西,我尝试了它,但它不起作用。
这是我的代码->

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");
     }
 }

它会在文件达到fileSizeLimitance时删除该文件:10000并创建一个新文件,即使我仍然在10分钟的时间范围内,我的retainedFileCountLimit:50和rollingInterval:RollingInterval.Day.
但是,当我设置retainedFileTimeLimit时:TimeSpan.FromDays(10)在文件大小超过限制时创建一个新文件,并且不删除旧文件。
我到处找这个,但除了this GitHub issue,我什么也没找到

k3bvogb1

k3bvogb11#

在serilog src中,您可以找到一个调用“ShouldRetainFile”方法,它过滤要删除的日志文件。它必须是“index >= _retainedFileCountLimit.Value - 1”和“file.DateTime.Value < now.Subtract(_retainedFileTimeLimit.Value)”

bool ShouldRetainFile(RollingLogFile file, int index, DateTime now)
{
    if (_retainedFileCountLimit.HasValue && index >= _retainedFileCountLimit.Value - 1)
        return false;

    if (_retainedFileTimeLimit.HasValue && file.DateTime.HasValue &&
        file.DateTime.Value < now.Subtract(_retainedFileTimeLimit.Value))
    {
        return false;
    }

return true;
}
r1zhe5dt

r1zhe5dt2#

也许你可以自己删除日志文件夹🤣

Task.Run(() =>
            {
                while (true)
                {
                    var folders = Directory.GetDirectories(logsFolder);
                    foreach (var folder in folders)
                    {
                        var sw = Stopwatch.StartNew();
                        var dir = new DirectoryInfo(folder);
                        if (dir.CreationTime.AddDays(3) < DateTime.Now) //3 days ago
                        {
                            sw.Restart();
                            Directory.Delete(folder, true);
                            sw.Stop();
                            logger?.Warning(
                                $"{folder} had been deleted in {sw.ElapsedMilliseconds}ms"
                            );
                        }
                    }
                    Thread.Sleep(TimeSpan.FromHours(1));//check per hours
                }
            });

相关问题