8

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

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

4

6 回答 6

15

如今 Serilog.Sinks.RollingFile 包已被弃用,取而代之的是 Serilog.Sinks.File(请参阅 github 项目自述文件介绍)。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"
            }
        }
    ]
  }

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

在此处输入图像描述

于 2019-04-23T09:25:52.067 回答
2

文档中:

为了避免使用失控的磁盘导致应用程序崩溃,滚动文件接收器默认将文件大小限制为 1GB。可以使用 fileSizeLimitBytes 参数更改或删除限制。

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

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

更新

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

于 2016-10-03T13:11:39.303 回答
1

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

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

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

于 2016-10-10T16:36:24.253 回答
1

在 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"   
      }
     }
   ],
  }
}
于 2019-03-15T08:33:15.530 回答
0

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

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

比如:.WriteTo.RollingFile("log-{Date}.Hour")

于 2017-09-07T11:39:01.207 回答
0

这是我的解决方案

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" );
      } )
  );   
于 2020-05-15T03:10:56.887 回答