web-dev-qa-db-ja.com

ネットコアがコンソールにログを記録しない

Microsoft LoggingExtensionsパッケージを使用してNetCore2.0でロギングを実験する簡単なテストプロジェクトがあります。

私が抱えている問題は、アプリを初めて実行したときに、期待どおりに情報メッセージがログに記録されることです。私が持っている奇妙な振る舞いは、その後の実行ではメッセージがまったく生成されないということです。

私のプロジェクトはNetCore 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パッケージを追加しました。これは、過去にNetCore1.0アプリでこれを行う必要があったことを漠然と覚えているためです。
  • 上記のパッケージをアンインストール/再インストールしました。
  • コマンドラインからdotnet.exeコマンドを使用してアプリを実行しようとしましたが、役に立ちませんでした。
  • NetCoreフレームワーク1.1(およびNuGetパッケージを1.1バージョン)にダウングレードすると、期待どおりに機能します。

編集:デバッグログプロバイダーをミックスに追加すると、コンソールウィンドウにログが表示されるようになりました。

NetCore 1.xアプリでは、コンソールプロバイダーを追加するだけで十分でした。

編集#2:コンソールロギングプロバイダーは、net-core-1.xの場合のように、メッセージをコンソールにすぐにフラッシュしないことが判明しました。バージョン。別のスレッドで実行されているようです。詳細については、このWebページを参照してください: https://github.com/aspnet/Logging/issues/631

13
ajawad987

@ 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();
    }
}
3