Serilog - MinimumLevel Override 需要使默认有效
Serilog - MinimumLevel Override required to make the default effective
我在这里 What does MinimumLevel and Override mean in appsettings.json logging context? 读到 Default
在 Serilog 中表示 default - 因此,以下配置应该有效:
appSettings.json
"Serilog": {
"MinimumLevel": {
"Default": "Warning"
}
}
然而,使用上面的配置我仍然得到 Information
级别的日志,如下所示:
[11:53:56 INF] Now listening on: http://0.0.0.0:5000
[11:53:56 INF] Application started. Press Ctrl+C to shut down.
[11:53:56 INF] Hosting environment: Development
[11:53:56 INF] Content root path: [some_path]
唯一对我有效的配置是:
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Warning"
}
}
}
以上,没有显示Information
级的日志。这似乎与提到的Whosebug答案和常识相矛盾。
这是我设置记录器的方式:
Log.Logger = new LoggerConfiguration()
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
.ReadFrom.Configuration(Configuration)
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.CreateLogger();
项目使用.NET Core 3.1开发。
我想知道 serilog 是否有什么特殊之处,或者我在配置中遗漏了一些重要步骤?
为了完整起见-这里是Main
:
public static void Main(string[] args)
{
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
和CreateHostBuilder
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Serilog 在 Startup.cs
中 ConfigureServices
的第一行使用上述代码 (Log.Logger = ...
) 初始化。
经过几个小时的搜索和尝试后,我注意到没有单一来源建议在任何 Startup.cs
方法中初始化 Serilog。
我的解决方案是通过以下方式将初始化移动到 Program.cs
:
public static void Main(string[] args)
{
SetupSerilog();
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
private static void SetupSerilog()
{
var appsettingsFilename = "appsettings.json";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(appsettingsFilename)
.AddEnvironmentVariables()
.Build();
Log.Logger = new LoggerConfiguration()
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.ReadFrom.Configuration(configuration)
.CreateLogger();
}
不幸的是,我几乎不明白为什么会这样,以及 Serilog
行为不同的原因是什么,这取决于记录器是在构造函数内部定义的,ConfigureServices
还是 Configure
Startup.cs
。我最初的想法是可以轻松访问 IConfiguration
。尽管如此,也许有人会发现上面的提示很有用。
我在这里 What does MinimumLevel and Override mean in appsettings.json logging context? 读到 Default
在 Serilog 中表示 default - 因此,以下配置应该有效:
appSettings.json
"Serilog": {
"MinimumLevel": {
"Default": "Warning"
}
}
然而,使用上面的配置我仍然得到 Information
级别的日志,如下所示:
[11:53:56 INF] Now listening on: http://0.0.0.0:5000
[11:53:56 INF] Application started. Press Ctrl+C to shut down.
[11:53:56 INF] Hosting environment: Development
[11:53:56 INF] Content root path: [some_path]
唯一对我有效的配置是:
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Warning"
}
}
}
以上,没有显示Information
级的日志。这似乎与提到的Whosebug答案和常识相矛盾。
这是我设置记录器的方式:
Log.Logger = new LoggerConfiguration()
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
.ReadFrom.Configuration(Configuration)
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.CreateLogger();
项目使用.NET Core 3.1开发。
我想知道 serilog 是否有什么特殊之处,或者我在配置中遗漏了一些重要步骤?
为了完整起见-这里是Main
:
public static void Main(string[] args)
{
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
和CreateHostBuilder
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Serilog 在 Startup.cs
中 ConfigureServices
的第一行使用上述代码 (Log.Logger = ...
) 初始化。
经过几个小时的搜索和尝试后,我注意到没有单一来源建议在任何 Startup.cs
方法中初始化 Serilog。
我的解决方案是通过以下方式将初始化移动到 Program.cs
:
public static void Main(string[] args)
{
SetupSerilog();
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
private static void SetupSerilog()
{
var appsettingsFilename = "appsettings.json";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(appsettingsFilename)
.AddEnvironmentVariables()
.Build();
Log.Logger = new LoggerConfiguration()
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.ReadFrom.Configuration(configuration)
.CreateLogger();
}
不幸的是,我几乎不明白为什么会这样,以及 Serilog
行为不同的原因是什么,这取决于记录器是在构造函数内部定义的,ConfigureServices
还是 Configure
Startup.cs
。我最初的想法是可以轻松访问 IConfiguration
。尽管如此,也许有人会发现上面的提示很有用。