我似乎无法让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");
,但这似乎无济于事。
我没主意了。
答案 0 :(得分:2)
Override()
的参数是名称空间限定的,因此,如果您的班级是MyApp.StartupCheck
,则需要在替代中包括完整的字符串,而不仅仅是类名。