Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Serilog中不同级别的不同日志文件_C#_.net_Logging_Serilog - Fatal编程技术网

C# Serilog中不同级别的不同日志文件

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

我正在使用serilog,我需要将不同的日志级别保存到不同的文件中(例如,调试级别为debug-20200708.log,调试级别为info-20200798.log和…)

我使用了下面的代码,但它不能正常工作

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
    // ...