[英]Logger.LogDebug vs Debug.WriteLine
我有这个程序
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 class 写入日志 output。 调用 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 中,但在调试和发布模式下都不会出现。
ILogger.LogDebug
, ILogger.LogTrace
等是关于消息的LogLevel
,而不是关于它的写入位置,基本上相当于使用相应的logLevel
参数值调用Log(..)
。 日志消息的写入目的地取决于您使用的记录器(控制台、文件、ETW,我相信您甚至可以创建一个写入调试视图的记录器,请参阅文档的日志记录提供程序部分)。 LogLevel
允许您过滤实际写入日志目标的日志级别,并由 appsettings 而非直接由构建配置进行调节(尽管您可以为不同的配置设置不同的设置)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.