这是我默认的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?
你的每个 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) 你有。
您可以使用 环境变量 配搭 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
是你的应用程序在运行时可以访问的。请注意,"命名空间 "是 "源语境前缀 "的同义词。