本文へスキップ
BecomeCoder

C#実践コース · 第4章 ログ出力 · レッスン23

ログの基本とログレベル

ブラウザで完結

導入

Console.WriteLineでのデバッグは手軽ですが、本番運用では「いつ・どの深刻度で・何が起きたか」を記録するログが不可欠です。障害調査の生命線になります。まずログの核心であるログレベルを理解しましょう。

図解

flowchart TB
    T["Trace/Debug<br/>詳細な開発用情報"] --> I["Information<br/>通常の動作記録"]
    I --> W["Warning<br/>異常ではないが注意"]
    W --> E["Error<br/>処理が失敗"]
    E --> C["Critical<br/>システム停止級"]
    style W fill:#fff3e0
    style E fill:#ffebee
    style C fill:#ffcdd2

サンプル

// 実務では Microsoft.Extensions.Logging の ILogger を使う(読み物):
//   logger.LogInformation("注文 {OrderId} を受け付けました", orderId);
//   logger.LogError(ex, "決済に失敗しました");
// ログレベルで「本番はWarning以上だけ出す」といったフィルタができるのが要点。

// ここでは考え方を最小の自作ロガーで体感する
var log = new SimpleLogger(minLevel: LogLevel.Warning);   // Warning以上だけ出力

log.Log(LogLevel.Information, "ユーザーがログイン");   // 出ない(閾値未満)
log.Log(LogLevel.Warning, "在庫が残りわずか");         // 出る
log.Log(LogLevel.Error, "決済APIが応答しない");        // 出る
// [Warning] 在庫が残りわずか
// [Error] 決済APIが応答しない

enum LogLevel { Trace, Debug, Information, Warning, Error, Critical }

class SimpleLogger
{
    private readonly LogLevel _minLevel;
    public SimpleLogger(LogLevel minLevel) => _minLevel = minLevel;

    public void Log(LogLevel level, string message)
    {
        if (level >= _minLevel)   // 閾値以上のログだけ出力する
            Console.WriteLine($"[{level}] {message}");
    }
}
  • ログにはレベル(深刻度)がある:Trace < Debug < Information < Warning < Error < Critical
  • 閾値を設定し「本番はWarning以上だけ」のようにフィルタできるのがログの要点
  • 実務ではConsole.WriteLineではなくILoggerMicrosoft.Extensions.Logging)を使う
  • メッセージに文脈(注文ID等)を含め、後から検索・追跡できるようにする

演習

var log = new SimpleLogger(LogLevel.Error);   // Error以上だけ

log.Log(LogLevel.Warning, "軽微な警告");   // 出ない
log.Log(LogLevel.Critical, "サーバー停止");  // 出る

enum LogLevel { Trace, Debug, Information, Warning, Error, Critical }

// TODO: 閾値(minLevel)以上のときだけ "[レベル] メッセージ" を出力する
//       SimpleLogger を定義してください(期待出力は Critical の1行)
___
  • 期待される出力: [Critical] サーバー停止
ヒント1を見る

enumは数値順で比較できるのでlevel >= _minLevelで閾値判定できます

ヒント2を見る

class SimpleLogger { private readonly LogLevel _min; public SimpleLogger(LogLevel min) => _min = min; public void Log(LogLevel level, string msg) { if (level >= _min) Console.WriteLine($"[{level}] {msg}"); } }

まとめ

  • ログはレベル(深刻度)を持ち、閾値でフィルタできる
  • 本番はWarning以上だけ、といった制御が運用の鍵
  • 実務ではILoggerを使い、文脈を含めて記録する

次回: 実務の定番ログライブラリLog4netです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。