【问题标题】:Serilog Won't Override Minimum Level For ILoggerSerilog 不会覆盖 ILogger 的最低级别
【发布时间】:2020-07-11 04:58:15
【问题描述】:

我似乎无法让 Serilog 覆盖我拥有的这个 IHostedService 类的最低级别设置。

这是我的程序.cs

// ...

LoggerConfiguration CreateLogConfig()
{
    var minLevel = Enum.Parse<LogEventLevel>(config["ApplicationLogging:MinimumLevel"]);

    var logger = new LoggerConfiguration()
        .Enrich.FromLogContext()

    // Set up global min level filters.
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("System", LogEventLevel.Error)
    .MinimumLevel.Override("StartupCheck", LogEventLevel.Information)
    .MinimumLevel.Is(minLevel)

    // ...

    return logger;
}

// ...

然后我有一个名为 StartupCheck.cs 的文件,如下所示:

public class StartupCheck : IHostedService
{
    private readonly ILogger<StartupCheck> logger;
    //  ...

    public StartupCheck(ILogger<StartupCheck> logger)
    {
        this.logger = logger;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        logger.LogInformation($"Build Number: { Assembly.GetExecutingAssembly().GetName().Version }");

        // ...
    }

    // ...

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

当最低级别设置为信息时,所有信息都会记录,但如果设置为更高级别,那么即使我知道它正在运行,我也看不到此类的任何内容。

通过谷歌搜索,我知道这与源上下文有关,但我无法弄清楚自动生成的源上下文是什么。我做了几次尝试都没有成功。我的示例代码具有类名,但我也尝试了完整的命名空间和命名空间的一部分。我也尝试过通过反射获取命名空间,但也没有用。我已经尝试实现 ILogger 并将记录器创建行更改为 factory.CreateLogger("StartupCheck"); 但这似乎没有任何作用。

我没有想法。

【问题讨论】:

  • 您介意详细说明“更高”在日志记录级别方面的含义吗?
  • 如果我将最低级别设置为错误,我将看不到任何内容,因为日志级别是该类中的信息。应该发生的是我应该看到该类的信息级别日志记录,因为它有一个覆盖,说它的最低级别是信息。

标签: c# asp.net-core serilog


【解决方案1】:

Override() 的参数是命名空间限定的,因此,如果您的类是 MyApp.StartupCheck,则需要在覆盖中包含完整的字符串,而不仅仅是类名。

【讨论】:

  • 可能有助于用所有细节更新您的问题,使其代表您的真实代码,包括 Serilog 配置的其余部分,以及您如何将其连接到 ASP.NET Core;问题似乎不在您发布的片段中。
猜你喜欢
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多