【问题标题】:How to configure Serilog with different log levels for each namespace in my project? I want to do it via application.json config file如何为我的项目中的每个命名空间配置具有不同日志级别的 Serilog?我想通过 application.json 配置文件来做
【发布时间】:2019-12-16 19:31:18
【问题描述】:

我们正在编写新的日志记录功能并注入到我们现有的服务中。

以下是我们的做法:

1) 在 Program.cs 中使用 UseSerilog() 调用设置 Serilog

2) 在 appsettings.json 中设置 Serilog 配置以设置接收器以写入日志文件。

3) 编写了一个 Facade 自定义 Logger 类,它使用 Serilog 全局 Log 实例在内部进行日志记录。

public class MyLogger<T> : IMyLogger<T>
public MyLogger()
    {
        _logger = Log.ForContext(typeof(T));
    }
public void LogInformation(Exception ex)
    {
        _logger.Information(ex.Message);
    }

4) 通过 DI 将 IMyLogger 注入到我现有的所有服务中

5) 在ConfigureServices()中注册所有服务(Logger、Project相关服务)

一切正常。但是我想在我的应用程序中为不同的命名空间设置不同的日志级别,以便在生产中我可以在配置中简单地设置只有 4-5 个重要的核心命名空间,其日志记录方法调用 (MyLogger.LogInformation()) 将被发送到日志文件。

下面这样的可能吗?因为 MyLogger 是记录的类。但是如果调用来自 MyProject.CartManager 命名空间,那么它应该根据示例中的下面的配置自动记录。

请分享你的想法。

例如:

"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
  "Default": "Information",
  "Override": {
    "Microsoft": "Warning",
    "System": "Information",
    "MyProject.Inventory":  "Information"
    "MyProject.CartManager":  "Error"
  }
}

【问题讨论】:

    标签: serilog serilog-exceptions


    【解决方案1】:

    正如您在配置中所建议的那样。可以这样做。 以下是示例配置。

    "serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "formatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter,Serilog.Formatting.Elasticsearch"
        }
      }
    ]}
    

    MinimumLevel 配置部分规定了默认值并覆盖特定命名空间。

    1. 默认日志级别是信息。
    2. Microsoft 命名空间中的类(Microsoft.Hosting.Lifetime 除外)的最低日志级别应为警告

    作为旁注,我将我的 Serilog 注册为

    webBuilder.UseSerilog((ctx, lc) => lc.ReadFrom.Configuration(ctx.Configuration));
    

    格式化程序部分在问题的上下文中是微不足道的,但如果你想使用它,我将 Serilog.Sinks.ElasticSearch 作为额外的包来使用它。

    【讨论】:

      【解决方案2】:

      您的IMyLogger 似乎太过分了。 Microsoft 提供Microsoft.Extensions.Logging 用于相同目的。所以你可以只注入ILogger&lt;MyProject.Inventory.Foo&gt; 到你的类中,Serilog 用Serilog.Extensions.Logging 包处理它。除此之外,您的示例必须按原样工作,满足您的期望。可能对于您的特定注入,您使用了错误的T(实现没有检查)。

      刚开始搜索几乎相同的内容:使用MinimumLevel 覆盖一些专用命名空间或上下文,首先发现这个问题没有答案,但下一个是this great article

      要领:

      Override 的第一个参数是源上下文前缀,通常与与记录器关联的类的命名空间限定类型名称匹配。

      // Using Serilog:
      var myLog = Log.ForContext<MyClass>();
      myLog.Information("Hello!");
      // -> SourceContext is "MyNamespace.MyClass"
      
      //Using Microsoft.Extensions.Logging:
      var myLog = loggerFactory.CreateLogger("MyNamespace.MyClass");
      myLog.LogInformation("Hello!");
      // -> SourceContext is "MyNamespace.MyClass"
      

      【讨论】:

        猜你喜欢
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2019-02-18
        • 1970-01-01
        相关资源
        最近更新 更多