如何为每个 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。
目前所有的任务记录都创建在一个日志文件中。我想为每个任务创建单独的日志文件而不是一个日志文件。 (当前日志文件包含批处理作业)
{
"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。