如何为我的项目中的每个命名空间配置具有不同日志级别的 Serilog?我想通过 application.json 配置文件来完成

Cod*_*ker 5 serilog serilog-exceptions

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

以下是我们的做法:

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);
    }
Run Code Online (Sandbox Code Playgroud)

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

d_f*_*d_f 0

看来你的IMyLogger太过分了。微软也Microsoft.Extensions.Logging出于同样的目的提供了服务。因此,您可以将其注入ILogger<MyProject.Inventory.Foo>到您的类中,Serilog 会使用包来处理该问题Serilog.Extensions.Logging。除此之外,您的示例必须按原样运行,满足您的期望。可能对于您的特定注射,您使用了错误T(实现对此没有检查)。

刚刚开始谷歌搜索几乎相同的内容:MinimumLevel对一些专用名称空间或上下文使用覆盖,首先发现这个问题没有答案,但下一篇是这篇很棒的文章

要点:

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

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