🐳

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

2024/12/31に公開

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

環境

Tools Version
.NET Core SDK 2.2.401

初めに

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

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    {
      "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が読み込まれているため、ランタイム環境に応じた設定が適用されています。

    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を以下のような設定にします。

    {
      "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の設定が適用されます。

最後に

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

参考

Discussion