如何在运行时更改注入实例的 Serilog LogLevel

Fel*_*ana 4 asp.net elasticsearch serilog asp.net-core

框架:.NET Core 2.1

我正在为 Serilog 使用 Elasticsearch 配置,如下面的代码所述:

启动文件

Log.Logger = new LoggerConfiguration().Enrich.FromLogContext()
                             .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(Configuration.GetSection("ElasticSearchURL").Value))
                             {
                                 AutoRegisterTemplate = true,
                                 MinimumLogEventLevel = Serilog.Events.LogEventLevel.Error
                             }).CreateLogger();
    services.AddSingleton(Log.Logger);
Run Code Online (Sandbox Code Playgroud)

是否可以在运行时更改注入的 Logger 实例的日志级别?

private readonly ILogger<EmailService> _logger;
public EmailService(ILogger<EmailService> logger)
{
     _logger = logger;
}

public async Task<Result> Send(Email email)
{
    // CHANGE LOG LEVEL TO LOGINFORMATION HERE
    _logger.LogInformation("MESSAGE");
}
Run Code Online (Sandbox Code Playgroud)

小智 8

除了在 Elasticsearch 选项中设置最小日志级别之外,您是否可以将其设置在 Logger 级别?如果你能够做类似的事情

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Error()
    .Enrich.FromLogContext()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(Configuration.GetSection("ElasticSearchURL").Value))
    {
        AutoRegisterTemplate = true
    }).CreateLogger();
Run Code Online (Sandbox Code Playgroud)

那么您就可以使用 LoggingLevelSwitch 来控制最低级别,如下所示:

var levelSwitch = new LoggingLevelSwitch();
levelSwitch.MinimumLevel = Serilog.Events.LogLevelEvent.Error;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.ControlledBy(levelSwitch)
    .Enrich.FromLogContext()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(Configuration.GetSection("ElasticSearchURL").Value))
    {
        AutoRegisterTemplate = true
    }).CreateLogger();
Run Code Online (Sandbox Code Playgroud)

您需要为 LoggingLevelSwitch 的实例提供类似单例的东西,以便与您的 ILogger 一起注入。