Serilog,在运行时更改特定命名空间的日志级别(> MinimumLevel)

Mar*_*rco 8 serilog

这是我的默认 Serilog 配置

SeriLogLevelSwitch.MinimumLevel = LogEventLevel.Information;
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.ControlledBy(SeriLogLevelSwitch)
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
    .Enrich.FromLogContext()
     ....
Run Code Online (Sandbox Code Playgroud)

当默认值为信息时,如何在运行时将特定命名空间的日志级别更改为调试?

Cai*_*ete 7

每个人MinimumLevel.Override都可以有自己的LoggingLevelSwitch,它允许您在运行时控制每个特定覆盖的日志级别。

创建单独LoggingLevelSwitch为每个覆盖你打算修改而应用程序正在运行,且这些实例存储在一个地方,你可以从你的应用程序的其他部分,这将允许您更改访问MinimumLevel这些的LoggingLevelSwitch(ES)。

例如

public class LoggingLevelSwitches
{
    // Logging level switch that will be used for the "Microsoft" namespace
    public static readonly LoggingLevelSwitch MicrosoftLevelSwitch
        = new LoggingLevelSwitch(LogEventLevel.Warning);

    // Logging level switch that will be used for the "Microsoft.Hosting.Lifetime" namespace
    public static readonly LoggingLevelSwitch MicrosoftHostingLifetimeLevelSwitch
        = new LoggingLevelSwitch(LogEventLevel.Information);
}
Run Code Online (Sandbox Code Playgroud)

配置您的 Serilog 日志记录管道以使用这些LoggingLevelSwitch实例:

static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Override("Microsoft", LoggingLevelSwitches.MicrosoftLevelSwitch)
        .MinimumLevel.Override("Microsoft.Hosting.Lifetime",
            LoggingLevelSwitches.MicrosoftHostingLifetimeLevelSwitch)
        .Enrich.FromLogContext()
        .CreateLogger();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序中的某处,例如,在处理可以在运行时更改的应用程序配置的代码中,将LoggingLevelSwitch实例更新为LogEventLevel您想要的新实例:

public class AppSettings
{
    void ChangeLoggingEventLevel()
    {
        LoggingLevelSwitches.MicrosoftHostingLifetimeLevelSwitch
            .MinimumLevel = LogEventLevel.Error;

        LoggingLevelSwitches.MicrosoftHostingLifetimeLevelSwitch
            .MinimumLevel = LogEventLevel.Warning;

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,LogEventLevelLoggingLevelSwitch实例控制,因此您可以决定在应用程序中的何处(以及如何)修改这些实例,以影响日志记录管道。

上面的示例我假设您的应用程序中有一个屏幕(或 API),用户可以配置日志记录级别。

如果没有,另一种方法是使用后台线程定期检查配置文件、环境变量或查询数据库等,以确定这些日志记录级别应该是什么。

如果您使用的是.NET Core主机,可以使用选项模式可处理配置的刷新你,并让你执行代码时的配置改变(你会改变MinimumLevel你的LoggingLevelSwitch(ES)你有。