如何为每个 class 或 ASP.Net 核心中的任务创建单独的 serilog

How to create individual serilog for each class or tasks in ASP.Net Core

目前所有的任务记录都创建在一个日志文件中。我想为每个任务创建单独的日志文件而不是一个日志文件。 (当前日志文件包含批处理作业)

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.RollingFile.Extension" ],
    "MinimumLevel": {
      "Default": "Warning",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "rollingInterval": "Day",
          "fileSizeLimitBytes": 10485760,
          "pathFormat": "RDJOBS_{Date}_{Level}.json",
          "path": "c://logs",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
        }
      },
      {
        "Name": "Seq",
        "Args": {
          "serverUrl": "http://localhost:5421"
        }
      }
    ]
  }
}

您可以使用Filter.ByExcluding()Filter.ByIncludingOnly()添加过滤表达式来过滤通过Serilog管道的事件,对于每个任务或class,当您使用它们时,您可以为他们设置一个属性,然后使用过滤器表达式过滤日志并写入不同的日志文件。

出于演示目的,我们可以在该方法执行路径中为 LogEvents 设置一个 属性。

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Worker is called");
        using (LogContext.PushProperty("foobar", 1))
        {
            Foo();
            await Task.CompletedTask;
        }
    }

以下代码片段显示了一个过滤示例。

const string logTemplate = @"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}] [{SourceContext:l}] {Message:lj}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
        .Enrich.FromLogContext()
        .WriteTo.Logger(l =>
        {
            l.WriteTo.File("log.txt", LogEventLevel.Information, logTemplate,
                rollingInterval: RollingInterval.Day
            );
            l.Filter.ByExcluding(e => e.Properties.ContainsKey("foobar"));
        })
        .WriteTo.Logger(l =>
        {
            l.WriteTo.File("foobar.txt", LogEventLevel.Information, logTemplate,
                rollingInterval: RollingInterval.Day
            );
            l.Filter.ByIncludingOnly(e => e.Properties.ContainsKey("foobar"));
        })
        .CreateLogger()

通过上面的配置,正常日志(日志事件中没有属性 foobar)将被保存到log.txt文件,而带有属性 foobar的日志将被保存到 foobar.txt 文件。

申请后运行结果如下:

更多详细信息,查看this sample