web-dev-qa-db-ja.com

.NET Core 2.0のログは壊れていますか?

.NET Core 2.0(+ ASP.NET Core 2.0)にアップグレードした後、トレースレベルのログ情報が出力されないようです。

実際、_dotnet new web_ projectを実行して、ConfigureのStartupに以下のコードを追加すると、トレースまたはデバッグログメッセージは表示されませんが、情報とエラーメッセージは2回表示されます。 .AddConsole() callをコメントアウトすると、これら(情報とエラー)が1回だけ出力されます。これは、デフォルトでコンソールプロバイダーで自動的に設定されることを示唆しています。これは「ファイル->新規」プロジェクトエクスペリエンスであり、_Program.cs_にはこのためのロギングまたは設定用のセットアップは何もありません-追加したものを除きます。誰もが見た?または、GitHubの問題を登録する必要があります。

_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Microsoft.Extensions.Logging.LogLevel.Trace);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        var logger = loggerFactory.CreateLogger("Blah");
        logger.LogTrace("Hello world : Trace");
        logger.LogDebug("Hello world : Debug");
        logger.LogInformation("Hello world : Information");
        logger.LogError("Hello world : Error");

        await context.Response.WriteAsync("Hello World!");
    });
}
_
31
EinarI

ロギングの設定方法が少し変更されました...推奨される方法(そして this GitHub issue/announcement で十分に文書化されています)これを行うには、AddLoggingのロガーを設定しますなどの方法

_services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        .AddConsole()
        .AddDebug();
});
_

そして、_appsettings.json_のような

通知

この例はすべてのロガーではなくConsoleプロバイダーの構成のみを示しているため、一部の人々は混乱しているようです。

LogLevelセクションは、すべてのネームスペース(Defaultキー)または特定のネームスペース(Systemのロギングレベルを構成します。ネームスペースが_System.*_で始まるすべてのクラスロギングのデフォルト値をオーバーライドします。

これは_ILogger<T>_のTで使用されるクラス用です。これにより、この名前空間のロガーのデフォルトのログレベルよりも高いまたは低いレベルを設定できます。

_{
  "ApplicationInsights": {
    "InstrumentationKey": ""
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Information",
      "System": "Warning",
      "Microsoft": "Information"
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning",
        "System": "Information",
        "Microsoft": "Information"
      }
    }
  }
}
_

Appsettings.jsonの構造が.NET Core 1.xで使用されていたものから変更され、_appsettings.json_のLoggingエントリにロガープロバイダー名が含まれるようになったことに注意してください。ロギングプロバイダーごとにロギングレベルを設定します。

以前は、_appsettings.json_のエントリはコンソールロガーにのみ適用できました。

または、代わりにWebHostBuilder内でロギングを移動できます。

_public static void Main()
{
    var Host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddJsonFile("hosting.json", optional: false)
                .AddEnvironmentVariables();
        })
        .ConfigureLogging((webhostContext, builder) => {
            builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging"))
            .AddConsole()
            .AddDebug();
        })
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    Host.Run();
}
_

更新

_appsettings.json_を使用したくない場合は、フィルターをコードに登録することもできます。

_services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        // filter for all providers
        .AddFilter("System", LogLevel.Debug)
        // Only for Debug logger, using the provider type or it's alias
        .AddFilter("Debug", "System", LogLevel.Information)
        // Only for Console logger by provider type
        .AddFilter<DebugLoggerProvider>("System", LogLevel.Error)
        .AddConsole()
        .AddDebug();
});
_
34
Tseng

Startup.csファイルのConfiguration.GetSection("Logging")の設定から"Logging"セクションを読み取るため、ほぼ20分を費やしました。 "Error"として設定されたappsettings.jsonファイル。 "Information"またはそれ以下に変更すると、問題が修正されました。

以下は、appsettinsg.jsonファイルの外観です。

{
  "Logging": {
    "IncludeScopes": true,
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

ロギングレベルの詳細("Information"など)を確認するには、ASP.NET Coreのロギングに関する一般情報も提供する this リンクを確認してください。

ロギングを機能させることに問題が生じた場合に備えて、ここに投稿しています。JSONファイルを確認してください。

8
Shimmy

上記のどれも私にはうまくいきません唯一の回避策はメソッドを書くことでした

private void ConfigLogging( ILoggingBuilder builder ) {
    builder.SetMinimumLevel( LogLevel.Trace );
    //... additional configuration...
}

addLogging拡張メソッドを使用する場合は、次のように記述します。

services.AddLogging( ConfigLogging );
6
Panos Theof

次のappsettings.jsonの構造はうまく機能しているようです:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console":
    {
      "IncludeScopes": true
    }
  }
}

https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1 から取得

また、あなたのスタートアップコールが何であるかを見てください、私は次の作品が私のために働くと思います:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {

        var logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Sink(jsonSink)
                .Enrich.WithExceptionDetails()
                .CreateLogger();

        Log.Logger = logger;
    }
}
0
Art