Serilog不会覆盖ILogger的最低级别

时间:2020-03-30 18:27:04

标签: c# asp.net-core serilog

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

这是我的程序。

// ...

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;
    }
}

当最低级别设置为“信息”时,所有信息都会记录,但是如果将其设置为更高的值,那么即使我知道它正在运行,我也不会从此类中看到任何东西。

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

我没主意了。

1 个答案:

答案 0 :(得分:2)

Override()的参数是名称空间限定的,因此,如果您的班级是MyApp.StartupCheck,则需要在替代中包括完整的字符串,而不仅仅是类名。