【问题标题】:Serilog - RollingFile Sink does not roll files based on date and sizeSerilog - RollingFile Sink 不会根据日期和大小滚动文件
【发布时间】:2016-10-02 20:48:53
【问题描述】:

我正在使用 Serilog - RollingFile Sink,但它将所有数据存储在一个文件中一天。 在我的应用程序中,一天写入 1 GB 日志。所以我想根据日期和大小滚动日志文件。

如何配置 RollingFile Sink 以根据日期和大小滚动文件?

【问题讨论】:

  • Serilog 不支持在文件达到特定大小时滚动。相反,如果在一天结束之前达到 fileSizeLimitBytes,那么当天的日志记录将停止。
  • 我有同样的需求,仍在寻找解决方案。 Caio 发布的替代滚动接收器似乎也不支持多线程。一种可能的解决方法是让您的工具在最后或您需要的任何时间间隔分解日志文件。

标签: c# serilog rollingfilesink


【解决方案1】:

现在 Serilog.Sinks.RollingFile 包已被弃用,取而代之的是 Serilog.Sinks.File(请参阅 github 项目 readme 介绍)。 Serilog.Sinks.File 包已升级以支持文件滚动。 您可以使用以下 Serilog 配置来启用按时间和大小滚动:

"Serilog": {
    "Using": ["Serilog.Sinks.File"],
    "MinimumLevel": "Debug",
    "WriteTo": [
        {
            "Name": "File",
            "Args": {
                "path": "logs/log.txt",
                "rollingInterval": "Day",
                "rollOnFileSizeLimit": true,
                "fileSizeLimitBytes": "512",
                "retainedFileCountLimit": 3,
                "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
            }
        }
    ]
  }

然后你会得到这样的东西:

【讨论】:

    【解决方案2】:

    来自documentation

    为避免因磁盘使用失控而导致应用程序崩溃,滚动文件 默认情况下,sink 将文件大小限制为 1GB。限制可以更改或 使用 fileSizeLimitBytes 参数删除。

    .WriteTo.RollingFile("log-{Date}.txt", fileSizeLimitBytes: null)
    

    该示例显示通过将限制设置为null 来移除限制。根据您的情况,将其设置为适当的大小。

    更新

    是的,根据您的评论,我查看了源代码,看起来 RollingFileSink 的最低计量单位是一天,因此似乎不支持在同一天拥有多个。但是,我没有仔细看,看起来RollingFileSink.cs 中的OpenFile 方法对序列号做了一些事情。您可能想看看代码在做什么。

    【讨论】:

    • fileSizeLimitBytes 确保文件的大小。这意味着在达到此限制后将停止记录。达到此限制后不会创建新文件。
    【解决方案3】:

    我相信您正在寻找 RollingFile 接收器的这种替代实现:

    Serilog 滚动文件接收器(替代)

    这是一个滚动文件接收器,允许您根据文件大小指定滚动行为。 https://github.com/BedeGaming/sinks-rollingfile

    【讨论】:

    • 它根据大小滚动文件。例如如果记录器在 2016 年 12 月 10 日初始化,它会创建一个新文件,但它会在 2016 年 10 月 13 日使用相同的文件,直到文件达到指定大小。我想根据日期和大小滚动文件。我想每天创建一个新文件,当文件达到指定大小时,应该创建一个带有日期和编号的新文件。在文件名中。例如Api-20161012-0002.log
    【解决方案4】:

    在 appsettings.json 你应该这样写:

    {
    "Serilog": {
    
      "Using": ["Serilog.Sinks.File"],
      "MinumumLevel": {
        "Default": "Error",
        "Override": {
          //"Microsoft": "Warning",
          //"System": "Warning",  
          "Microsoft.AspNetCore.Authentication": "Verbose",
          "WebApplicationLogger1.Startup": "Warning",
          "WebApplicationLogger1.Pages": "Warning"
        }
      },
      "WriteTo": [
        {
          "Name": "RollingFile",
          "Args": {
            "rollingInterval": "Day",  // --> THIS IS THAT YOU NEED
            "pathFormat": "C:\\Logfiles\\File-{Date}.log",
            "restrictedToMinimumLevel": "Warning"   
          }
         }
       ],
      }
    }
    

    【讨论】:

      【解决方案5】:

      当前版本还实现了每小时滚动。 这可能是您问题的另一种解决方案。

      {Hour} 每小时创建一个文件。文件名使用 yyyyMMddHH 格式。

      喜欢: .WriteTo.RollingFile("log-{Date}.Hour")

      【讨论】:

        【解决方案6】:

        这是我的解决方案

        private readonly Serilog.ILogger _logger; //= Log.ForContext( "Name", "Weather" );
        
        public WeatherForecastController() {
          string subPath = Path.Combine( DateTime.Now.ToString( "yyyy" ), DateTime.Now.ToString( "MM" ) ) + $"/{DateTime.Now.ToString("dd")}_Weather";
          _logger = Log.ForContext( "Name", subPath );
        }
        

          .UseSerilog( ( hostingContext, loggerConfiguration ) => loggerConfiguration
            .ReadFrom.Configuration( hostingContext.Configuration )
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .WriteTo.Map(
              "Name",
              "Request",
              ( name, wt ) => {
                if (name == "Request")
                  wt.RollingFile( Path.Combine( $"{hostingContext.Configuration["LogPath"]}/{{Date}}-{name}.txt" ) );
                else
                  wt.File( $"{hostingContext.Configuration["LogPath"]}/{name}.txt" );
              } )
          );   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-13
          相关资源
          最近更新 更多