2

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

 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 表。这个问题有没有解决方案(没有将全局日志级别设置为信息)?

4

1 回答 1

1

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

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

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

Log.Logger = ....

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

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

然后你可以WriteTo.Logger告诉

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

另一种(但在我看来较差)解决方案是配置多个WriteTo.Logger:-

  1. 设置minimumLevelError
  2. 另一个以minimumLevelleft 作为默认值(暗示 >= Information),但仅获取您想要的特定Information级别消息。
于 2019-12-29T23:21:02.833 回答