c# - Serilog 请求记录最终记录在事件日志中

标签 c# asp.net-core-mvc asp.net-core-3.1 serilog event-log

这是一个 ASP.NET Core 3.1 Web 应用程序。我有 Serilog 请求日志记录,如 https://nblumhardt.com/2019/10/serilog-in-aspnetcore-3/ 中所述。和 https://github.com/serilog/serilog-aspnetcore ,而且效果很好。唯一的问题是,它还将每个 HTTP 请求写入 Windows 事件日志,这使得它变得毫无值(value),因为现在每当我想要查找异常信息时,大海捞针都变得巨大。

我的设置如下所示。如您所见,我没有注册 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 时,这导致我的请求日志记录被推送到事件日志中。解决方案是确保并清除所有默认提供程序,然后重新添加事件日志提供程序并将最低级别设置为警告。

Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.AddEventLog(options =>
            options.Filter((s, level) => level >= LogLevel.Warning));
    }
    .UseSerilog(...)

关于c# - Serilog 请求记录最终记录在事件日志中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68186409/

相关文章:

azure - IIS 上托管的应用程序中的身份验证思想 Azure AD

c# - 我在 Azure 日志流中看不到日志

c# - 如何修改 Blazor(服务器)中的当前文化日期格式?

C# Gzip 在服务器端错误地压缩字节数组

c# - ValueConversionAttribute 类的重点是什么?

c# - 使用 NOT IN (SELECT ...) 时查询执行速度非常慢

c# - 追加到 .NET Core 3.1 中 Azure blob 文件的末尾,而不下载整个文件

c# - EF中Add-Migration中StartupProjectName参数的用途是什么

c# - asp.net 5 MVC 6 web api访问现有数据库

asp.net-mvc - 如何在 asp.net core Asp.net Mvc 6 中创建验证码?