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

问题描述 投票:2回答:1

这是我默认的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()
     ....

当默认值为Information时,我如何在运行时将特定命名空间的日志级别改为Debug?

serilog
1个回答
3
投票

你的每个 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);
}

配置您的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();

    // ...
}

然后在你的应用程序中的某个地方,例如,在处理应用程序配置的代码中,可以在运行时改变,更新一下 LoggingLevelSwitch 实例到新的 LogEventLevel 你想要的。

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

        LoggingLevelSwitches.MicrosoftHostingLifetimeLevelSwitch
            .MinimumLevel = LogEventLevel.Warning;

        // ...
    }
}

如你所见 LogEventLevel 是由 LoggingLevelSwitch 实例,所以您可以决定在您的应用程序中的哪些地方(以及如何)修改这些实例,以影响日志记录管道。

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

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

如果你使用的是 .NET Core Host,你可以使用 选项模式 它可以为你处理配置的刷新,并允许你在配置改变时执行代码(在这里你会改变你的 MinimumLevel 你的 LoggingLevelSwitch(e) 你有。


0
投票

您可以使用 环境变量 配搭 MinimumLevel.Override 将日志级别改为 Debug 在运行时为一个特定的命名空间命名,就像这样。

using System;

...

SeriLogLevelSwitch.MinimumLevel = LogEventLevel.Information;
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.ControlledBy(SeriLogLevelSwitch)
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
    .MinimumLevel.Override(Environment.GetEnvironmentVariable("SPECIFIC_NAMESPACE"), LogEventLevel.Debug)
    .Enrich.FromLogContext()
     ....

然后,确保环境变量 SPECIFIC_NAMESPACE 是你的应用程序在运行时可以访问的。请注意,"命名空间 "是 "源语境前缀 "的同义词。

环境.GetEnvironmentalVariable

© www.soinside.com 2019 - 2024. All rights reserved.