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

时间:2019-12-16 19:31:18

标签: serilog serilog-exceptions

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

以下是我们的方法:

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

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

3)编写了一个Facade Custom 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()中注册所有服务(记录器,与项目相关的服务)

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

是否可能出现以下情况?因为MyLogger是记录的类。但是,如果调用来自MyProject.CartManager命名空间,则它应基于示例中下面的配置自动登录。

请分享您的想法。

例如:

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

1 个答案:

答案 0 :(得分:0)

您的IMyLogger似乎过多。微软出于同一目的提供Microsoft.Extensions.Logging。因此,您可以仅将ILogger<MyProject.Inventory.Foo>注入类中,而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"