【C#】appsettings.jsonでログの出力レベルを制御する

.NET (Core) アプリケーションでは、ソースコードを修正することなく、設定ファイル(appsettings.json)を書き換えるだけで「どのレベルのログを出力するか」を調整できます。

本番環境ではエラーのみを表示し、開発環境ではデバッグ情報をすべて表示するといった切り替えが容易になります。

目次

ログレベル (LogLevel) の一覧

ログレベルは Microsoft.Extensions.Logging.LogLevel 列挙体で定義されています。

数値が小さいほど詳細な情報を含み、大きいほど緊急性が高くなります。設定したレベル以上のログが出力されます。

Level意味
Trace0最も詳細な記録。機密情報を含む可能性のあるメモリダンプなど。
Debug1開発時のデバッグ用情報。変数の値や詳細な分岐フローなど。
Information2アプリの通常の操作フロー(開始、終了、リクエスト受信など)。
Warning3エラーではないが、注意すべき事象(ディスク容量低下など)。
Error4現在の処理が失敗したエラー(例外発生など)。アプリ自体は継続可能。
Critical5アプリケーションのクラッシュやシステム停止につながる致命的なエラー。
None6ログを出力しない。

実装サンプル:金融データ更新サービス

以下の例では、名前空間 FinanceApp(自作アプリ)のログ設定を Error (エラー) 以上に制限しています。これにより、TraceやInformationレベルのログは無視され、ErrorとCriticalのみが表示されます。

1. appsettings.json (設定ファイル)

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "System": "Warning",
      "Microsoft": "Warning",
      "FinanceApp": "Error"
    }
  }
}
  • Default: 個別設定がないカテゴリのデフォルト値。
  • FinanceApp: 今回作成するアプリの名前空間。ここは "Error" に設定されているため、情報ログや警告ログは出力されなくなります。

2. Program.cs (ホスト設定)

appsettings.json の設定を読み込むには、AddConfiguration が必要です。

using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;

namespace FinanceApp
{
    class Program
    {
        static async Task Main(string[] args) =>
            await CreateHostBuilder(args).Build().RunAsync();

        private static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((context, logging) =>
                {
                    // 1. 既定のプロバイダを一度クリア
                    logging.ClearProviders();

                    // 2. appsettings.json の "Logging" セクションを適用 (重要)
                    logging.AddConfiguration(context.Configuration.GetSection("Logging"));

                    // 3. コンソール出力機能を追加
                    logging.AddConsole();
                })
                .ConfigureServices((context, services) =>
                {
                    // サービスの登録
                    services.AddHostedService<StockUpdateService>();
                });
    }
}

3. StockUpdateService.cs (ログ出力クラス)

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

namespace FinanceApp
{
    // 株価データを更新するバックグラウンド処理(という設定)
    public class StockUpdateService : BackgroundService
    {
        private readonly ILogger<StockUpdateService> _logger;

        public StockUpdateService(ILogger<StockUpdateService> logger)
        {
            _logger = logger;
        }

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // appsettings.json で "FinanceApp": "Error" と設定しているため、
            // Error未満のログはフィルタリング(無視)されます。

            _logger.LogTrace("詳細トレース: 変数 Dump = null");    // 表示されない
            _logger.LogDebug("デバッグ: ループ処理を開始します");    // 表示されない
            _logger.LogInformation("情報: 株価データの更新を開始"); // 表示されない
            _logger.LogWarning("警告: 応答時間が閾値を超えました"); // 表示されない

            // ↓ 設定値(Error)以上なので、これらは表示される
            _logger.LogError("エラー: データベースへの接続に失敗しました");
            _logger.LogCritical("致命的: システムを停止します");

            return Task.CompletedTask;
        }
    }
}

実行結果

コンソールには ErrorCritical のログだけが出力されます。

fail: FinanceApp.StockUpdateService[0]
      エラー: データベースへの接続に失敗しました
crit: FinanceApp.StockUpdateService[0]
      致命的: システムを停止します

解説

  • 名前空間ごとの制御:appsettings.json のキー(左側)には名前空間(カテゴリ)を指定します。例えば “System”: “Warning” とすれば、.NETフレームワーク内部の大量の Information ログを抑制しつつ、自分のアプリ(FinanceApp)だけは Debug を出して詳細に追う、といった使い分けが可能です。
  • ClearProvidersの注意点:logging.ClearProviders() を呼ぶと、デフォルトで設定されていた「appsettings.json との紐付け」も解除されてしまいます。そのため、その後に必ず logging.AddConfiguration(…) を記述して、設定ファイルを再度読み込ませる必要があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次