C# Serilog中不同级别的不同日志文件
我正在使用serilog,我需要将不同的日志级别保存到不同的文件中(例如,调试级别为debug-20200708.log,调试级别为info-20200798.log和…) 我使用了下面的代码,但它不能正常工作C# Serilog中不同级别的不同日志文件,c#,.net,logging,serilog,C#,.net,Logging,Serilog,我正在使用serilog,我需要将不同的日志级别保存到不同的文件中(例如,调试级别为debug-20200708.log,调试级别为info-20200798.log和…) 我使用了下面的代码,但它不能正常工作 var baseLogger = new Serilog.LoggerConfiguration() .WriteTo.Logger(l => l .Filter.ByIncludingOnly(e => e.Level == LogEventLeve
var baseLogger = new Serilog.LoggerConfiguration()
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Fatal))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Fatal),
formatter: formatter)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Error),
formatter: formatter)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Warning),
formatter: formatter)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Information),
formatter: formatter)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Debug),
formatter: formatter)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Verbose))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Verbose),
formatter: formatter)
.Enrich.FromLogContext();
_logger = baseLogger.CreateLogger();
我在不同的表中插入SQLServer时遇到了这个问题。我就是这样解决的
Log.Logger = new LoggerConfiguration()
.WriteTo.Conditional(x => x.Level == Serilog.Events.LogEventLevel.Error, conf => conf.MSSqlServer(Configuration.GetConnectionString("LogConnectionString"),
new SinkOptions { AutoCreateSqlTable = true, TableName = "Error" }))
.WriteTo.Conditional(x => x.Level == Serilog.Events.LogEventLevel.Warning, conf => conf.MSSqlServer(Configuration.GetConnectionString("LogConnectionString"),
new SinkOptions { AutoCreateSqlTable = true, TableName = "Warning" }))
.WriteTo.Conditional(x => x.Level == Serilog.Events.LogEventLevel.Debug, conf => conf.MSSqlServer(Configuration.GetConnectionString("LogConnectionString"),
new SinkOptions { AutoCreateSqlTable = true, TableName = "Debug" }))
.WriteTo.Conditional(x => x.Level == Serilog.Events.LogEventLevel.Information, conf => conf.MSSqlServer(Configuration.GetConnectionString("LogConnectionString"),
new SinkOptions { AutoCreateSqlTable = true, TableName = "Information" }))
.WriteTo.Conditional(x => x.Level == Serilog.Events.LogEventLevel.Verbose, conf => conf.MSSqlServer(Configuration.GetConnectionString("LogConnectionString"),
new SinkOptions { AutoCreateSqlTable = true, TableName = "Verbose" }))
.CreateLogger();
它不起作用的主要原因是,您没有使用筛选器的
.WriteTo
,而是使用主管道(未应用筛选器)的.WriteTo
例如,代替:
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Fatal))
.WriteTo.File(
path: GetLogPath(LogEventLevel.Fatal),
formatter: formatter)
您需要(注意括号中的差异):
这适用于您的每个.WriteTo
呼叫,因为它们都有相同的问题
一旦解决了这个问题,您将看到日志现在被写入到相应的文件中,除了Verbose
和Debug
(文件为空)。原因是Serilog的默认MinimumLevel
是Information
,因此任何低于该值的内容都将被忽略。要解决此问题,您需要在日志管道配置中将MinimumLevel
设置为Verbose
:
var baseLogger = new Serilog.LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(l => l
// ...
附言:还有一种不同的方法来做你正在做的事情,你可以看到水槽。只是好奇——但为什么?这将使它很难遵循,产生成本也很高,“它不能正常工作”如何?与您期望它做的相比,它做了什么?@Fildor将所有级别插入所有文件请参见以下内容:@PeymanMehrabani您如何解决此问题?
var baseLogger = new Serilog.LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(l => l
// ...