【问题标题】:is there a way to overwrite Serilog global logger's log level有没有办法覆盖 Serilog 全局记录器的日志级别
【发布时间】:2019-12-28 07:12:00
【问题描述】:

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

 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 表,因为在 startup.cs 类中定义了全局错误级别设置。有没有解决这个问题(不将全局日志级别设置为信息)?

【问题讨论】:

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


    【解决方案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 为 &lt;MyClass&gt;,则包含信息

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

    1. minimumLevel 设置为 Error
    2. 另一个将 minimumLevel 保留为默认值(暗示 >= Information),但仅获取您想要的特定 Information 级别消息。

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多