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

.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からログが表示されます。`Console`と`Debug`の設定は任意で、設定しない場合、`LogLevel`の設定が適用されます。

# 最後に

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

# 参考
- https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/environments?view=aspnetcore-2.2
- https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2