Serilog 没有获取应用程序事件,只有编码记录器事件
Serilog not getting application events, only coded logger events
我将我的应用程序设置为使用 Serilog 作为日志记录机制。事实上,我确实获得了日志文件,并且可以在 Seq 上查看它们。最初我记录了应用程序事件,但由于某种原因我不再记录它们。见下图。
在第一张图片中,我正在获取应用程序事件。后来,在进行相同的测试操作时,我不再获取应用程序事件,只有文件中的编码事件(即 _logger.LogWarning("Warning");
)
我在 Main 方法中设置了 Serilog。
public static int Main(string[] args)
{
var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
.AddEnvironmentVariables()
.Build();
//Configure logger
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
Log.Information("Logger created");
try
{
Log.Information("Starting web host");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Web Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
我的 Serilog 设置
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile",
"Serilog.Sinks.Async",
"Serilog.Sinks.ApplicationInsights",
"Serilog.Sinks.Console",
"Serilog.Sinks.Seq"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "C:/Logs/Serilog/log-{Date}.log" }
},
{
"Name": "Seq",
"Args": { "serverUrl": "http://localhost:5341" }
}
]
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "WebTemplate"
}
}
在继续使 Serilog 更具功能性之前,我想弄清楚为什么我不再获取应用程序事件。
您似乎在 BuildWebHost()
中缺少 UseSerilog()
:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog() // <- Add this line
.UseStartup<Startup>()
.Build();
假设您安装了 Serilog.AspNetCore NuGet 包。
我希望这与您的 Serilog 设置中的以下部分有关:
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
}
Nicholas Blumhardt 的 blog post 详细介绍了 Override
设置的工作原理:
The effect of the configuration above, then, is to generate events only at or above the Warning level when the logger is owned by a type in a Microsoft.* namespace.
这句话似乎直接适用于您的情况,您要求 Serilog 过滤掉属于 Microsoft 的所有事件。* 命名空间 和 的严重性低于Warning
.
您在第一个屏幕截图中显示的消息来自 MVC 或 Entity Framework,它们位于 Microsoft.* 命名空间中,并且将以低于警告的严重性进行记录。
我将我的应用程序设置为使用 Serilog 作为日志记录机制。事实上,我确实获得了日志文件,并且可以在 Seq 上查看它们。最初我记录了应用程序事件,但由于某种原因我不再记录它们。见下图。
在第一张图片中,我正在获取应用程序事件。后来,在进行相同的测试操作时,我不再获取应用程序事件,只有文件中的编码事件(即 _logger.LogWarning("Warning");
)
我在 Main 方法中设置了 Serilog。
public static int Main(string[] args)
{
var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
.AddEnvironmentVariables()
.Build();
//Configure logger
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
Log.Information("Logger created");
try
{
Log.Information("Starting web host");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Web Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
我的 Serilog 设置
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile",
"Serilog.Sinks.Async",
"Serilog.Sinks.ApplicationInsights",
"Serilog.Sinks.Console",
"Serilog.Sinks.Seq"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "C:/Logs/Serilog/log-{Date}.log" }
},
{
"Name": "Seq",
"Args": { "serverUrl": "http://localhost:5341" }
}
]
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "WebTemplate"
}
}
在继续使 Serilog 更具功能性之前,我想弄清楚为什么我不再获取应用程序事件。
您似乎在 BuildWebHost()
中缺少 UseSerilog()
:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog() // <- Add this line
.UseStartup<Startup>()
.Build();
假设您安装了 Serilog.AspNetCore NuGet 包。
我希望这与您的 Serilog 设置中的以下部分有关:
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
}
Nicholas Blumhardt 的 blog post 详细介绍了 Override
设置的工作原理:
The effect of the configuration above, then, is to generate events only at or above the Warning level when the logger is owned by a type in a Microsoft.* namespace.
这句话似乎直接适用于您的情况,您要求 Serilog 过滤掉属于 Microsoft 的所有事件。* 命名空间 和 的严重性低于Warning
.
您在第一个屏幕截图中显示的消息来自 MVC 或 Entity Framework,它们位于 Microsoft.* 命名空间中,并且将以低于警告的严重性进行记录。