Serilog中不同级别的日志有不同的日志文件。

4

我正在使用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();

1
只是好奇 - 但为什么?这将使其非常难以跟踪和产生成本高昂? - Daniel A. White
它不能正常工作。为什么?与您期望的相比,它做了什么? - Fildor
@Fildor 将所有级别插入到所有文件中。 - Peyman Mehrabani
请参见以下链接:https://dev59.com/_bLma4cB1Zd3GeqPg9N_ - jdweng
@PeymanMehrabani 你怎么解决这个问题? - Mohammad Taherian
2个回答

4

它不起作用的主要原因是你没有使用过滤器的.WriteTo,而是使用了主管道的.WriteTo(它没有应用过滤器)。

例如,你应该这样做:

.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.Fatal)
    .WriteTo.File(
        path: GetLogPath(LogEventLevel.Fatal),
        formatter: formatter))

这适用于每个 .WriteTo 调用,因为它们都有相同的问题。
一旦你解决了这个问题,你会发现日志现在被写入到相应的文件中,除了 VerboseDebug> (文件为空)。原因是 Serilog 的默认 MinimumLevelInformation,因此低于该级别的内容将被忽略。要解决这个问题,你需要在日志管道配置中将 MinimumLevel 设置为 Verbose
var baseLogger = new Serilog.LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Logger(l => l
    // ...

提示:还有一种不同的方法可以使用 Serilog.Sinks.Map sink 来完成您正在进行的操作,您可以在这里看到示例


2

我曾经在往不同的表格中插入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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接