【问题标题】:.Net Core EventLog - override unhandled exception are written to Application log.Net Core EventLog - 覆盖未处理的异常被写入应用程序日志
【发布时间】:2021-04-13 11:55:21
【问题描述】:

我已在我的 .Net Core 5.0 应用程序中配置 EventLog 以将应用程序事件记录到自定义事件日志:

public Startup (IConfiguration configuration)
    {
        this.configuration = configuration;
        this.logger = LoggerFactory.Create(logging=>{
            logging.AddConsole();
            logging.AddEventLog(settings=> {
                settings.LogName = configuration["EventLogName"];
                settings.SourceName = configuration["EventLogSourceName"];
                settings.Filter = (category, level) =>  level >= LogLevel.Trace;
            });
        }).CreateLogger("Stage server logger");
    }

我在 appsettings 中的日志配置:

    "Logging": {
    "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
    },
    "EventLog": {
        "LogLevel": {
            "Default": "Information"
        }
    }
}

一切正常,但一些消息(尤其是未处理的异常)被写入“应用程序”日志而不是配置 [“EventLogName”] 日志。知道如何配置应用程序以将应用程序中的所有消息记录到 configuration["EventLogName"] 日志吗? 非常感谢

【问题讨论】:

    标签: .net-core custom-eventlog


    【解决方案1】:

    我看到你在你的startup.cs 中创建了一个Logger 的实例。我想你在你的DI中注册了它?如果是,您不会看到所有来源的日志,因为它们可能没有使用您的 Logger 实例。你只是在配置一个特定的Logger,而不是LoggerFactory

    您可以在program.cs 中尝试这样的事情吗:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((hostBuilder, logBuilder) => {
                    logBuilder.AddConsole();
                    logBuilder.AddEventLog(set => {
                        set.LogName = hostBuilder.Configuration["EventLogName"];
                        set.SourceName = hostBuilder.Configuration["EventLogSource"];
                        set.Filter = (category, level) => level >= LogLevel.Trace;
                    });
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    

    这样,我也在为我不控制的代码 - 依赖项配置 Logger

    但是,如果您想要一个最简单的解决方案来修复未处理的异常,快速修复将是创建一个中间件,使用 try-catch 并通过 DI 注入的特定 Logger 记录异常重新抛出。

    【讨论】:

    • Michal 感谢您的帮助,将日志配置移至 program.cs 解决了问题。在 DI 我注册 LoggerFactory.Create(logging=>{ }).CreateLogger("Stage server logger");它可以根据我的需要工作。谢谢!
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-09-12
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多