【发布时间】:2020-05-31 19:50:57
【问题描述】:
我有这个程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace debuglogtest
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
和这个工人
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace debuglogtest
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogDebug("_logger.LogDebug");
_logger.LogTrace("_logger.LogTrace");
Debug.WriteLine("Debug.WriteLine");
}
}
}
还有这个配置
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
当我在调试 dotnet run -c Debug 中运行它时,我会在控制台中得到它
dbug: debuglogtest.Worker[0] _logger.LogDebug
这是意料之中的,因为据我了解,当我们编译程序时,我们会得到调试日志。但是当我使用dotnet run -c Release 编译它时,我仍然在控制台中得到它
dbug: debuglogtest.Worker[0] _logger.LogDebug
但 DebugView 中什么也没有:
我的期望:
-
_logger.LogDebug在debug编译的时候在console和DebugView都写,在Release编译的时候没有地方 -
Debug.WriteLine在debug编译时写在DebugView中
实际发生了什么:
-
_logger.LogDebug只写入控制台,调试模式下不写入 DebugView
Debug.WriteLine 仅在调试模式下编译时正确写入。
我以为LogDebug 在后台调用Debug.WriteLine,但也许Debug.WriteLine 和Logger.LogDebug 是两个不同的东西?我肯定看起来像。我认为这很令人困惑,因为我们需要在两个不同的地方(编译和过滤时)控制调试日志。如果我阅读文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#debug 它说它调用相同的Debug.WriteLine:
调试提供程序使用 System.Diagnostics.Debug 类写入日志输出。调用 System.Diagnostics.Debug.WriteLine 写入 Debug 提供程序。
我做错了吗?我一定是误会了什么。我希望在调试模式下编译时能够控制Logger.Debug。这不可能吗?
更新
如果我检查源(即使它有点旧(有人知道更新的参考,请说明)):https://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging.Debug/DebugLogger.debug.cs 我可以看到它定义了#define DEBUG,并调用了Debug.WriteLine,但是它没有在我的脑海中加起来。它应该在 DebugView 中显示,但在调试和发布模式下都没有。
【问题讨论】: