Serilog 请求记录最终出现在事件日志中
Serilog request logging ends up in event log
这是一个 ASP.NET 核心 3.1 网络应用程序。我有 Serilog 请求日志记录,如 https://nblumhardt.com/2019/10/serilog-in-aspnetcore-3/ and https://github.com/serilog/serilog-aspnetcore 中所述,它工作正常。唯一的问题是它还会将每个 HTTP 请求写入 Windows 事件日志,这让它变得毫无价值,因为现在无论何时我想查找异常信息,大海捞针都变得巨大。
我的设置如下所示。如您所见,我没有注册 EventLog 接收器。
public static void Main(string[] args)
{
LoggerConfiguration loggerConfiguration = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.Console(outputTemplate: LOG_TEMPLATE)
#if DEBUG
.WriteTo.Debug(outputTemplate: LOG_TEMPLATE)
#else
.WriteTo.File(new Serilog.Formatting.Compact.RenderedCompactJsonFormatter(), LOG_FILE_PATH)
#endif
;
Log.Logger = loggerConfiguration.CreateBootstrapLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((context, services, configuration) => configuration // 2-stage initialization so that we use the config values: https://github.com/serilog/serilog-aspnetcore
.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate: LOG_TEMPLATE)
#if DEBUG
.WriteTo.Debug(outputTemplate: LOG_TEMPLATE)
#else
.WriteTo.File(new Serilog.Formatting.Compact.RenderedCompactJsonFormatter(), LOG_FILE_PATH)
#endif
, writeToProviders: true)
事实证明,如果我设置了 writeToProviders: true
,则不会向事件日志写入任何内容,但实际上我需要它,因为我有一个自定义 ILogger
和 ILoggerFactory
(我们使用 JSNLog 记录 Javascript 错误并将它们写入 ELMAH),所以我猜必须有一个默认的 Microsoft 接收器,它将内容放入事件日志或其他内容中。
有办法解决这个问题吗?预先感谢您的帮助。
花了很长时间才最终搞清楚,但关键是回过头来 Microsoft logging documentation 发现日志记录组件默认带有四个提供程序:console、debug、EventSource 和EventLog(当 Windows 上 运行 时),所以当我使用 writeToProviders: true
时,这导致我的请求日志记录被推送到事件日志中。解决方案是确定并清除所有默认提供程序,然后 re-add 事件日志并将最低级别设置为警告。
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddEventLog(options =>
options.Filter((s, level) => level >= LogLevel.Warning));
}
.UseSerilog(...)
这是一个 ASP.NET 核心 3.1 网络应用程序。我有 Serilog 请求日志记录,如 https://nblumhardt.com/2019/10/serilog-in-aspnetcore-3/ and https://github.com/serilog/serilog-aspnetcore 中所述,它工作正常。唯一的问题是它还会将每个 HTTP 请求写入 Windows 事件日志,这让它变得毫无价值,因为现在无论何时我想查找异常信息,大海捞针都变得巨大。
我的设置如下所示。如您所见,我没有注册 EventLog 接收器。
public static void Main(string[] args)
{
LoggerConfiguration loggerConfiguration = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.Console(outputTemplate: LOG_TEMPLATE)
#if DEBUG
.WriteTo.Debug(outputTemplate: LOG_TEMPLATE)
#else
.WriteTo.File(new Serilog.Formatting.Compact.RenderedCompactJsonFormatter(), LOG_FILE_PATH)
#endif
;
Log.Logger = loggerConfiguration.CreateBootstrapLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((context, services, configuration) => configuration // 2-stage initialization so that we use the config values: https://github.com/serilog/serilog-aspnetcore
.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate: LOG_TEMPLATE)
#if DEBUG
.WriteTo.Debug(outputTemplate: LOG_TEMPLATE)
#else
.WriteTo.File(new Serilog.Formatting.Compact.RenderedCompactJsonFormatter(), LOG_FILE_PATH)
#endif
, writeToProviders: true)
事实证明,如果我设置了 writeToProviders: true
,则不会向事件日志写入任何内容,但实际上我需要它,因为我有一个自定义 ILogger
和 ILoggerFactory
(我们使用 JSNLog 记录 Javascript 错误并将它们写入 ELMAH),所以我猜必须有一个默认的 Microsoft 接收器,它将内容放入事件日志或其他内容中。
有办法解决这个问题吗?预先感谢您的帮助。
花了很长时间才最终搞清楚,但关键是回过头来 Microsoft logging documentation 发现日志记录组件默认带有四个提供程序:console、debug、EventSource 和EventLog(当 Windows 上 运行 时),所以当我使用 writeToProviders: true
时,这导致我的请求日志记录被推送到事件日志中。解决方案是确定并清除所有默认提供程序,然后 re-add 事件日志并将最低级别设置为警告。
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddEventLog(options =>
options.Filter((s, level) => level >= LogLevel.Warning));
}
.UseSerilog(...)