Serilog 滚动文件

Serilog RollingFile

我正在尝试将 WriteTo.RollingFile 与 Serilog 一起使用,如下所示,每天写入一个文件:

var log = new LoggerConfiguration().WriteTo.RollingFile(
                    @"F:\logs\log-{Date}.txt",
                    LogEventLevel.Debug).CreateLogger();
            log.Information("this is a log test");

但我正在为同一天的每个日志条目获取一个新的日志文件

如何配置 Serilog 每天写入一个新文件,以便每天有一个日志文件?


是否有任何归档过程可以删除超过 7 天的文件?

试试下面的方法:

 var log = new LoggerConfiguration()
          .MinimumLevel.Debug()
          .WriteTo.File(@"f:\log\log.txt", rollingInterval: RollingInterval.Day) 
          .CreateLogger();

日志文件名将自动为 log-20150819.txt 等。您无需指定 date.Old 文件将按照 retainedFileCountLimit 进行清理 - 默认值为 31。

作为对此的后续行动,请确保您随后使用全局范围的 "Log" 实例。

示例:

Log.Information("Hello world");

这是在 asp.net MVC 4/5 应用程序中通过 web.config 使用 Serilog 的方法。

在您的 web.config 中添加以下内容:

<add key="serilog:minimum-level" value="Information" />
<add key="serilog:minimum-level:override:Microsoft" value="Information" />
<add key="serilog:minimum-level:override:System" value="Information" />
<add key="serilog:using:RollingFile" value="Serilog.Sinks.RollingFile" />
<add key="serilog:write-to:RollingFile.pathFormat" value="./Logs/log-{Date}.txt" />
<add key="serilog:write-to:RollingFile.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}" />
<add key="serilog:write-to:RollingFile.retainedFileCountLimit" value="10" />

然后在global.asax的Application_Start中添加以下内容:

// Get application base directory
string basedir = AppDomain.CurrentDomain.BaseDirectory;

// Setup Serilog for logging
Log.Logger = new LoggerConfiguration()
            .ReadFrom.AppSettings()
            .WriteTo.RollingFile(basedir + "/Logs/log-{Date}.txt")
            .CreateLogger();

要使用相同的文件,您必须添加 shared: true

.WriteTo.RollingFile("log-{Date}.txt", shared: true)

WriteTo.RollingFile 已弃用

自发布答案以来,方法 RollingFile 不再可行,取而代之的是 File 和滚动日志的选项。

现在必须使用支持滚动的标准 Serilog.Sinks.File NuGet 包:

.WriteTo.File(path: @"e:\logs\skilliam.log", 
              rollingInterval: RollingInterval.Day,
              rollOnFileSizeLimit: true, 
              fileSizeLimitBytes: 123456);

要启用多进程共享日志文件,将共享设置为真:

在代码中

.WriteTo.RollingFile("log-{Date}.txt", shared: true)

或在web.config

<add key="serilog:write-to:RollingFile.shared" value="true" />

我是这样做的:

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

WriteTo.RollingFile 已弃用 -> 使用格式化程序

如果使用文本格式化程序 ITextFormatter,请注意 path 的变量位置在使用 File 时已切换到第二位。

因此请将此格式与格式化程序一起使用:

var filepath = @"C:\Logs";
ITextFormatter jsonFormatter = new Serilog.Formatting.Json.JsonFormatter(renderMessage: true);

...

Log.Logger = new LoggerConfiguration()
                  ... // Enrichers etc...
                 .WriteTo.File(formatter: jsonFormatter,
                               path: filepath,                            
                               rollingInterval: RollingInterval.Day,
                               rollOnFileSizeLimit: true, 
                               fileSizeLimitBytes: 123456,
                               shared: true)
                 .CreateLogger();