繁体   English   中英

Logger.LogDebug 与 Debug.WriteLine

[英]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

这在 DebugView 调试输出的DebugView

这是意料之中的,因为据我了解,当我们编译程序时,我们会得到调试日志。 但是当我使用dotnet run -c Release在版本中编译它时,我仍然在控制台中得到它

dbug: debuglogtest.Worker[0] _logger.LogDebug

但在 DebugView 中什么都没有:

发布输出的DebugView

我的期望:

  1. _logger.LogDebug在debug编译的时候在console和DebugView都写,在Release编译的时候没有地方
  2. Debug.WriteLine是在 debug 编译时写在 DebugView 中的

实际发生了什么:

  1. _logger.LogDebug只写入控制台,在调试模式下不写入 DebugView

只有在调试模式下编译时才能正确写入Debug.WriteLine

我认为LogDebug在后台调用Debug.WriteLine ,但也许Debug.WriteLineLogger.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.LogDebugILogger.LogTrace等是关于消息的LogLevel ,而不是关于它的写入位置,基本上相当于使用相应的logLevel参数值调用Log(..) 日志消息的写入目的地取决于您使用的记录器(控制台、文件、ETW,我相信您甚至可以创建一个写入调试视图的记录器,请参阅文档的日志记录提供程序部分)。 LogLevel允许您过滤实际写入日志目标的日志级别,并由 appsettings 而非直接由构建配置进行调节(尽管您可以为不同的配置设置不同的设置)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM