36

我正在尝试使用WriteTo.RollingFileSerilog,如下所示每天写入一个文件:

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

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

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


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

4

8 回答 8

52

试试下面:

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

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

于 2015-08-20T01:55:01.720 回答
28

不推荐使用 WriteTo.RollingFile

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

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

.WriteTo.File(path: @"e:\logs\skilliam.log", 
              rollingInterval: RollingInterval.Day,
              rollOnFileSizeLimit: true, 
              fileSizeLimitBytes: 123456);
于 2018-12-15T17:06:01.087 回答
3

To use the same file, you have to add shared: true

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

于 2018-07-06T17:38:17.490 回答
3

这是在 asp.net MVC 4/5 应用程序中将 Serilog 与 web.config 一起使用的方法。

在您的 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" />

然后在Application_Startglobal.asax 中添加以下内容:

// 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();
于 2018-01-04T20:46:59.757 回答
3

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

在代码中

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

或在 web.config

<add key="serilog:write-to:RollingFile.shared" value="true" />
于 2019-02-05T15:08:36.513 回答
2

作为对此的跟进,请确保您随后使用全局范围的“日志”实例。

例子:

Log.Information("Hello world");
于 2016-09-30T22:14:28.460 回答
0

不推荐使用 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();
于 2021-03-07T20:07:43.320 回答
-1

我是这样做的:

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:16:44.267 回答