我有这个程序
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>();
});
}
}
使用这个 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
时,控制台会输出以下内容:
同时,在DebugView中也可以看到如下内容:dbug: debuglogtest.Worker[0] _logger.LogDebug
![DebugView of debug output](https://istack.dev59.com/wbakN.webp)
dotnet run -c Release
在发布模式下编译时,控制台仍然会输出以下信息:
但是在DebugView中没有任何内容:dbug: debuglogtest.Worker[0] _logger.LogDebug
![DebugView of release output](https://istack.dev59.com/ATJw2.webp)
- 在编译调试模式时,
_logger.LogDebug
会同时在控制台和DebugView中输出,而在编译发布模式时不会输出。 - 在编译调试模式时,
Debug.WriteLine
要输出到DebugView中。
- 在调试模式下,
_logger.LogDebug
只输出到控制台,而不会在DebugView中显示。
Debug.WriteLine
在调试模式下正确地输出到DebugView。我认为
LogDebug
在幕后调用了Debug.WriteLine
,但也许Debug.WriteLine
和Logger.LogDebug
是两个不同的东西?这看起来确实令人困惑,因为我们需要在两个不同的地方(编译和过滤时)控制调试日志。如果我阅读文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#debug,它说它调用相同的Debug.WriteLine
:
我是否做错了什么?我一定有什么误解。我希望能够在调试模式下编译时控制调试提供程序使用System.Diagnostics.Debug类编写日志输出。对System.Diagnostics.Debug.WriteLine的调用将写入调试提供程序。
Logger.Debug
。这不可能吗?如果我查看源代码(虽然它有点旧了(有人知道更新的参考资料请指明)):https://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging.Debug/DebugLogger.debug.cs,我可以看到它定义了
#define DEBUG
并调用了Debug.WriteLine
,但是这在我的脑海中不成立。它应该出现在DebugView中,但无论是在调试模式还是发布模式下都没有出现。
CreateDefaultHost
仍然会添加.AddDebug()
。这与日志记录有什么关系呢?我不能使用Logger
来写入能在 DebugView 中显示的源吗? - mslot.AddDebug()
添加了DebugProvider,应该在DebugView中显示出来。它出现在控制台中,因为应用了.AddConsole
,并且使用#define DEBUG
,理论上它应该在发布模式下显示(理论上)。只有当应用某种过滤器时(我猜是这样),才会出现这种情况。我认为这是奇怪的行为。 - mslot#define DEBUG
激活写入调试信息,但是它停止的地方是第 44 行。再次感谢! - mslot