这是我的默认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()
....
默认为信息时,如何在运行时将日志级别更改为特定 namespace 的调试?
最佳答案
您的每个MinimumLevel.Override
都可以具有自己的LoggingLevelSwitch
,这使您可以在运行时控制每个特定替代的日志级别。
为您打算在应用程序运行时修改的每个替代项创建单独的LoggingLevelSwitch
,并将这些实例存储在可从应用程序其他部分访问的位置,这将允许您更改这些MinimumLevel
的LoggingLevelSwitch
。
例如
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主机,则可以使用Options pattern,它可以为您处理配置的刷新,并允许您在配置更改时执行代码(您可以在其中更改
MinimumLevel
的LoggingLevelSwitch
(es ) 你有。