有没有办法覆盖 Serilog 全局记录器的日志级别

is there a way to overwrite Serilog global logger's log level

我想要的场景是将全局日志级别设置为错误。这是我在启动时调用的配置代码 class:

 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))

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

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

问题是 Serilog 不会将信息日志 写入 SQL table 因为 [=24] 中定义的全局错误级别设置=] class。这个问题有什么解决方案吗(不将全局日志级别设置为信息)?

MinimumLevel.Error() 构造旨在成为一个粗略的高级过滤器,它可以在它进入接收器之前非常有效地排除日志记录方式。虽然想要依赖它是很自然的,但这并不重要——如果你稍后在日志管道中通过白名单日志条目进行过滤,你会惊讶于 Serilog 的效率仍然如此。

WriteTo.Logger 和其他接收器也提供了一种等效的方法来设置将进入该接收器的最小级别。因此,关键是只在该级别进行过滤(使用 minimumLevel 可选参数覆盖)。

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

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 级别消息。