有一种方法可以覆盖Serilog全局记录器的日志级别

问题描述 投票:1回答:1

我想要的情况是将全局日志级别设置为错误。这是在启动类中调用的我的配置代码:

 Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Error()
            .WriteTo.Logger(p=>p.Filter.ByIncludingOnly(evt => evt.Level == 
 LogEventLevel.Error).WriteTo.MSSqlServer(ConnectionString, "Serilogs",
                null, LogEventLevel.Error, 50,
                null, null, false, columnOptions))

但是问题是我想在控制器的某些操作方法中编写一些自定义的Information log,如下所示:

            Log.Logger.Information("{User} {RawUrl} ", 
      userId,actionContext.Request.RequestUri.AbsolutePath);

问题是Serilog 不写信息日志到SQL表,因为在startup.cs类中定义了全局错误级别设置。是否有解决此问题的方法(未将全局日志级别设置为“信息”)?

asp.net-mvc serilog serilog-exceptions
1个回答
0
投票

MinimumLevel.Error()构造旨在用作粗略的高级滤波器。

WriteTo.Logger和其他接收器也提供了等效的方法来设置将要到达该接收器的最小电平。因此,关键是仅在该级别进行过滤(使用minimumLevel可选参数替代)。

一旦您删除了全局过滤,根据设计,该过滤将阻止您的日志请求被捕获,甚至将其提交到接收器,下一步是为您的Filter.ByIncluding找到一种方法LogEvent级别的Information是相关的-一种示例方式是将特定上下文列入白名单(但是您可能也只想用属性标记它)。示例:

Log.Logger = ....

var importantInfoLog = Log.Logger.ForContext<MyClass>();

importantInfoLog.Information("Warning, this is important Information!")

然后您可以告诉WriteTo.Logger

  • 包括任何内容> =错误
  • 如果SourceContext是<MyClass>,则包含信息

另一种(但我认为较差的)解决方案是配置多个WriteTo.Logger:-

  1. [minimumLevel设置为Error]
  2. [minimumLevel保留为默认值(表示> = Information),但仅捕获所需的特定Information级别消息。
© www.soinside.com 2019 - 2024. All rights reserved.