ASP.NET Core ILogger 不会记录到 Trace,除非附加了调试器

ASP.NET Core ILogger does not log to Trace unless a debugger is attached

我有一个奇怪的情况,我无法从 ASP.NET 核心 ILogger<T> 接收任何跟踪,除非附加了调试器(即使我在调试配置中 运行)。先解释一下:

我需要按日期将日志写入文件,我之前为此编写了一个简单的自定义 TraceListener,因此我认为我可以在不编写新的日志提供程序的情况下重用它:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.AddTraceSource("IISLogCleaner");
                // I added below line to make sure I am not missing anything
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

Startup.ConfigureServices()中,我添加监听器:

            var listener = new DailyTraceListener(folder);
            Trace.Listeners.Add(listener);

现在记录后台任务:

    ILogger<CleanupTask> logger;

    public CleanupTask(ILogger<CleanupTask> logger)
    {
        this.logger = logger;
    }

    // ...

    async Task<int> WorkAsync(CancellationToken token)
    {
        System.Diagnostics.Debug.WriteLine("Start Working");
        this.logger.LogInformation("Start working");

        await Task.Delay(1000);

        this.logger.LogInformation("Work finished");
        return await Task.FromResult(10000);
    }

问题是:附加调试器后,所有日志都写入日志文件。但是,当我选择 运行 而不调试时,即使在调试配置中,也不会创建任何文件,也不会写入任何内容,直到我添加了 Debug.WriteLine 调用,现在只有这些行被记录,但所有logger.LogInformation() 未记录。

输出 window 但是,收到所有消息:

为了安全起见,我删除了appsettings.Development.json文件,只剩下appsettings.json。这是日志内容:

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

多年以后,我知道,但我相信你正在打这个:

ASP.Net Core Logging and DebugView.exe

我今天花了 3 个小时在这个上,感觉你的油漆


TL;DR:Debugger.IsAttached 在 Microsoft.Extensions.Logging.Debug 内检查。