NetCore无法向控制台输出日志

13

我有一个简单的测试项目,用来尝试使用Microsoft Logging扩展包记录NetCore 2.0中的日志。

我的问题是,当我第一次运行应用程序时,它像预期的那样记录信息消息。但我遇到的奇怪行为是,随后的运行完全不会产生任何消息。

我的项目针对Net Core 2.0框架,安装了以下NuGet包:

  • Microsoft.Extensions.Logging
  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug

以下是我正在尝试使用的示例代码:

using System;

namespace LoggingNetCore2
{
    using Microsoft.Extensions.Logging;

    class Program
    {
        static void Main(string[] args)
        {
            var loggerFactory = new LoggerFactory();
            loggerFactory.AddConsole();
            loggerFactory.AddDebug(); // <-- why is this needed for console logging?

            var logger = loggerFactory.CreateLogger(typeof(Program));
            logger.LogInformation("Hello, World!");
            logger.LogTrace("trace");
            logger.LogDebug("debug");
            logger.LogWarning("warning");
            logger.LogCritical("critical");
            logger.LogError("errrrr");

            //using (logger.BeginScope("MyMessages"))
            //{
            //    logger.LogInformation("Beginning Operation...");
            //    logger.LogInformation("Doing something cool... please wait.");
            //    logger.LogInformation("Completed successfully.");
            //}
        }
    }
}

当我运行以上代码时,控制台窗口没有输出。有什么想法会导致这种情况吗?

我尝试过以下操作:

  • 添加Microsoft.Extensions.Logging.Abstractions包,因为我对NetCore 1.0应用程序的需要模糊记忆了。
  • 卸载/重新安装上述包。
  • 我甚至尝试通过dotnet.exe命令从命令行运行应用程序,但无济于事。
  • 如果我降级到NetCore框架1.1(和NuGet包到1.1版本),则一切正常。

编辑:如果将调试日志记录提供程序加入其中,现在可以在控制台窗口中显示日志。

在NetCore 1.x应用程序中,只需添加控制台提供程序即可。

编辑#2:结果发现,与net-core-1.x版本不同,控制台日志记录提供程序不会立即将消息刷新到控制台。它似乎在另一个线程上运行。请参阅此网页以获取信息:https://github.com/aspnet/Logging/issues/631

1个回答

5

@ajawad987,你是对的。 Dispose() 起作用了。

public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection()
            .AddLogging(config => config.AddConsole())
            .BuildServiceProvider();

        services.GetRequiredService<ILogger<Program>>()
            .LogCritical("Hello");

        ((IDisposable) services)?.Dispose();
    }
}

1
尝试在.NET Core 2.0中处理服务集合并没有起作用 - 抛出了InvalidCastException异常。清除日志的方法是在应用程序结束时处理serviceProvider:ServiceProvider serviceProvider = services.BuildServiceProvider(); ... serviceProvider.Dispose(); - LeslieM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接