Serilog RollingFile

时间:2015-08-20 01:28:01

标签: c# .net serilog

我正在尝试将WriteTo.RollingFile与Serilog一起使用,如下所示:

WP.clear();

我的理解是日志文件将根据日期创建和命名,并且它每天都会写入一个新文件,但是我在同一天为每个日志条目获取一个新的日志文件! 如何配置Serilog每天写入一个新文件,理想情况下我每天只有一个日志文件?

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

8 个答案:

答案 0 :(得分:22)

尝试以下:

 var log = new LoggerConfiguration()
          .MinimumLevel.Debug()
          .WriteTo.RollingFile(@"f:\log\log.txt", retainedFileCountLimit:7) 
          .CreateLogger();

日志文件名将自动为log-20150819.txt等。您无需指定日期。

答案 1 :(得分:3)

现在,在2018年,标准的Serilog.Sinks.File NuGet软件包支持滚动:

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

答案 2 :(得分:2)

作为后续操作,请确保您使用全局范围" Log"实例

示例:

Log.Information("Hello world");

答案 3 :(得分:1)

要使用同一文件,您必须添加$Path = 'c:\test2' $delim = '-' # table for extensions & associated email addresses $extensions = @{ 'bob@test.com' = '23'; 'jack@test.com' = '1000'; 'blah@test.com' = '765' } Get-ChildItem $Path -Name | foreach { $nameArray = $_.Split($delim) $newName = $nameArray[2] + " " + ($nameArray[0].Substring(0, 8)) $ext = $nameArray[3] $emailAddress = $extensions[$ext] Write-Output $newName Write-Output $emailAddress }

  

.WriteTo.RollingFile(“ log- {Date} .txt”,共享:true)

答案 4 :(得分:0)

这是一种在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" />

然后在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();

答案 5 :(得分:0)

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

用代码

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

或在web.config中

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

答案 6 :(得分: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();

答案 7 :(得分:-2)

这是我的方法:

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