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

时间:2019-12-28 07:12:00

标签: asp.net-mvc serilog serilog-exceptions

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

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

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

1 个答案:

答案 0 :(得分:0)

MinimumLevel.Error()构造旨在用作粗略的高级过滤器,可以在将其记录到接收器之前极其有效地排除日志记录方式。想要依靠它是很自然的,但它并不重要-如果您稍后在日志记录管道中通过将日志条目列入白名单进行过滤,您会惊讶的是Serilog仍然有多么高效。

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