.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が生成されているはずです。
{
"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からログが表示されます。Console
とDebug
の設定は任意で、設定しない場合、LogLevel
の設定が適用されます。
最後に
以前に色々検証したコードを久しぶりに動かしたら、コンソールにログが表示されず、あれこれ悩んでしまいました。まとめてみるとすごーく当たり前のことだったと認識しました😀
Discussion