LoginSignup
5
12

More than 3 years have passed since last update.

.NET Coreのappsettings.jsonのLoggerの設定を理解する

Posted at

.NET Coreを始めたのですが、理解が浅かったのでこまめにまとめたいと思います。
appsettings.jsonの扱いとLoggerの設定についてまとめます。

環境

Tools Version
.NET Core SDK 2.2.401

初めに

$dotnet new webapp -o SampleAppを実行してプロジェクトを作成します。
以下のようなappsettings.jsonとappsettings.Development.jsonが生成されているはずです。

appsettings.json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
appsettings.Development.json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Debug",
          "System": "Information",
          "Microsoft": "Information"
        }
      }
    }

以降では、appsettings.jsonやappsettings.Environment.jsonの設定がどのように反映されているかという話をしていきます。

複数環境での実行について

.NET Coreでのランタイム環境は環境変数ASPNETCORE_ENVIRONMENTを利用します。
例えば、$ASPNETCORE_ENVIRONMENT=Development dotnet runとして実行した場合、appsettings.jsonの設定値を読み込み、appsettings.Development.jsonの設定で上書きをします。
当然、$ASPNETCORE_ENVIRONMENT=Production dotnet runとして実行した場合、appsettings.Development.jsonの設定値ではなく、appsettings.Production.jsonの設定を使用します。

Program.csではWebHost.CreateDefaultBuilder(args)を実行していますが、手動で設定する場合は以下のようなコードになります。ConfigureAppConfigurationの部分のようにappsettings.jsonが読み込まれているため、ランタイム環境に応じた設定が適用されています。

Program.cs
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            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, reloadOnChange: true);
                config.AddEnvironmentVariables();
            })
            .ConfigureLogging((hostingContext, logging) =>
            {
                // Requires `using Microsoft.Extensions.Logging;`
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
                logging.AddDebug();
                logging.AddEventSourceLogger();
            })
            .UseStartup<Startup>()
    }

そのため、appsettings.jsonでは各ランタイム環境で共通の設定を記載し、固有の設定はappsettings.Environment.jsonに行うことになります。

Loggingの設定について

上記コードのConfigureLoggingを抜粋すると、AddConsole()AddDebug()が実行されています。
これにより、通常出力とデバック出力をそれぞれ設定することができます。
例えば、appsettings.jsonを以下のような設定にします。

appsettings.json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning",
          "System": "Warning",
          "Microsoft": "Warning"
        },
        "Console": {
          "LogLevel": {
            "Default": "Information",
            "System": "Information",
            "Microsoft": "Information"
          }
        },
        "Debug": {
          "LogLevel": {
            "Default": "Debug",
            "System": "Debug",
            "Microsoft": "Debug"
          }
        }
      }
    }

Loglevelに関しては以下のようになっており、設定した値以降のログが全て表示されます

  • Trace
  • Debug
  • Information
  • Warning
  • Error
  • Critical

この場合は、通常出力ではInformationからログが表示され、デバッグ出力ではDebugからログが表示されます。ConsoleDebugの設定は任意で、設定しない場合、LogLevelの設定が適用されます。

最後に

以前に色々検証したコードを久しぶりに動かしたら、コンソールにログが表示されず、あれこれ悩んでしまいました。まとめてみるとすごーく当たり前のことだったと認識しました😀

参考

5
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
12