C# Tips | ログ・例外・診断:JSONログ

C# C#
スポンサーリンク

はじめに:コンソールログは「今この瞬間の動き」を見るための窓

業務でも学習でも、まず一番最初に触るログがコンソールログです。
画面にそのまま出るので、「今なにが起きているか」をリアルタイムで確認できます。
バッチ処理の進捗を見たいとき、ツールの動きを確認したいとき、デバッグ中に一時的に状態を出したいときに、とても役に立ちます。

ここでは、単なる Console.WriteLine から一歩進んで、「業務でも通用するコンソールログ」に育てていく流れを、初心者向けに丁寧に説明していきます。


基本の一歩:Console.WriteLine でログを出す

まずは「出す」ことに慣れる

一番シンプルな形はこれです。

Console.WriteLine("アプリを開始します。");
Console.WriteLine("処理中です...");
Console.WriteLine("アプリを終了します。");
C#

これだけでも、「どこまで処理が進んだか」を目で追うことができます。
ただし、このままだと「いつのログか」「どの種類のログか」が分かりません。
業務で使うには、もう少し“ログらしさ”が欲しくなります。


ログらしくする:日時とレベルを付ける

「いつ・どんな種類の出来事か」を一行で分かるようにする

最低限、次の情報があると一気に読みやすくなります。

日時
ログレベル(INFO、WARN、ERROR など)
メッセージ本文

これを小さなメソッドにまとめてみます。

static void Log(string level, string message)
{
    var line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{level}] {message}";
    Console.WriteLine(line);
}
C#

使う側はこう書きます。

Log("INFO", "アプリ開始");
Log("INFO", "処理中...");
Log("ERROR", "エラーが発生しました");
C#

出力は次のようになります。

2026-04-17 11:30:01 [INFO] アプリ開始
2026-04-17 11:30:02 [INFO] 処理中...
2026-04-17 11:30:05 [ERROR] エラーが発生しました

ここでの重要ポイントは、「日時とレベルを付けるだけで“ただの出力”が“ログ”になる」ということです。
後から見返したときに、「いつ何が起きたか」を一行で把握できます。


さらに見やすく:色付きコンソールログ

重要度を色で一瞬で見分ける

コンソールは文字色を変えられます。
エラーは赤、警告は黄色、情報はグレー、といった色分けをすると、スクロールしながらでも重要な行が目に飛び込んできます。

まず、共通の書き出しメソッドを少し拡張します。

static void WriteWithColor(string level, ConsoleColor color, string message)
{
    var line = $"{DateTime.Now:HH:mm:ss} [{level}] {message}";

    var oldColor = Console.ForegroundColor;
    Console.ForegroundColor = color;
    Console.WriteLine(line);
    Console.ForegroundColor = oldColor;
}
C#

これを使って、レベルごとのメソッドを用意します。

static void LogInfo(string message)
    => WriteWithColor("INFO", ConsoleColor.Gray, message);

static void LogWarning(string message)
    => WriteWithColor("WARN", ConsoleColor.Yellow, message);

static void LogError(string message)
    => WriteWithColor("ERROR", ConsoleColor.Red, message);
C#

使い方は次の通りです。

LogInfo("処理開始");
LogWarning("設定ファイルが見つかりません。デフォルト値を使用します。");
LogError("致命的なエラーが発生しました。");
C#

ここでの重要ポイントは、「色を変えたら必ず元の色に戻す」ことです。
Console.ResetColor() でも良いですが、元の色を保存して戻す形にしておくと、他の出力との相性も良くなります。


実務イメージ:バッチ処理の進捗をコンソールに出す

「どこまで進んだか」「どこで落ちたか」をリアルタイムで追う

夜間バッチやデータ移行ツールなど、時間のかかる処理では、進捗が見えるだけで安心感が違います。
コンソールログを使って、処理の開始・終了・エラーを出してみます。

static void RunBatch()
{
    LogInfo("バッチ開始");

    try
    {
        LogInfo("ステップ1開始");
        Step1();
        LogInfo("ステップ1完了");

        LogInfo("ステップ2開始");
        Step2();
        LogInfo("ステップ2完了");

        LogInfo("バッチ正常終了");
    }
    catch (Exception ex)
    {
        LogError($"バッチ異常終了: {ex}");
    }
}
C#

実行中にコンソールを見ていれば、「今どのステップか」「どこで止まったか」がすぐ分かります。
ここでの重要ポイントは、「長めの処理には“開始”と“完了”のログをセットで出す」ことです。
これはコンソールでもファイルでも、ログ設計の基本パターンになります。


ASP.NET Core などでのコンソールログ:ILogger と AddConsole

コードは ILogger に統一し、出力先としてコンソールを選ぶ

Web アプリやサービスでは、Console.WriteLine ではなく ILogger<T> を使うのが標準的です。
この ILogger の出力先として「コンソール」を選ぶのが、実務でのコンソールログの基本形です。

Program.cs の例です。

var builder = WebApplication.CreateBuilder(args);

// 既定で Console ログは有効ですが、明示的に書くと分かりやすいです。
builder.Logging.ClearProviders();
builder.Logging.AddConsole();   // コンソールにログを出す

var app = builder.Build();
C#

アプリ側のコードは、ILogger を受け取ってログを書くだけです。

public class SampleService
{
    private readonly ILogger<SampleService> _logger;

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

    public void DoWork()
    {
        _logger.LogInformation("処理開始");
        // 何か処理
        _logger.LogInformation("処理完了");
    }
}
C#

実行すると、コンソールに日時・レベル・カテゴリ(SampleService など)付きでログが出力されます。
ここでの重要ポイントは、「出力先(コンソール・ファイル・クラウドなど)は設定で切り替えられ、コード側は ILogger だけ意識すればよい」ということです。


小さなコンソールログユーティリティを作る

毎回同じ書き方をしないために「フォーマットを一箇所に閉じ込める」

コンソールアプリや小さなツールでは、ILogger を使わずに、自前のシンプルなロガーを用意するのも現実的です。
先ほどのコードを、クラスとしてまとめてみます。

public static class ConsoleLogger
{
    private static void Write(string level, ConsoleColor color, string message)
    {
        var line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{level}] {message}";

        var oldColor = Console.ForegroundColor;
        Console.ForegroundColor = color;
        Console.WriteLine(line);
        Console.ForegroundColor = oldColor;
    }

    public static void Info(string message)
        => Write("INFO", ConsoleColor.Gray, message);

    public static void Warn(string message)
        => Write("WARN", ConsoleColor.Yellow, message);

    public static void Error(string message)
        => Write("ERROR", ConsoleColor.Red, message);
}
C#

使う側は、とてもシンプルになります。

ConsoleLogger.Info("ツール開始");
ConsoleLogger.Warn("設定ファイルが見つかりません。デフォルトを使用します。");
ConsoleLogger.Error("処理中にエラーが発生しました。");
C#

ここでの重要ポイントは、「ログのフォーマットや色分けを一箇所に集約する」ことです。
あとからフォーマットを変えたくなっても、このクラスだけ修正すれば全体に反映されます。


コンソールログと他のログの関係を意識する

「今すぐ見たいログ」と「後から読み返したいログ」

コンソールログは、「今この瞬間の動き」を見るのに向いています。
一方で、数日後・数週間後に調査したいときは、ファイルログや集中ログ(クラウドなど)のほうが適しています。

開発中や手動実行のツールでは、コンソールログが主役になります。
本番運用では、コンソールログは補助的な位置づけで、
メインはファイルやログ基盤に送られたログ、という構成が多いです。

ここでの重要ポイントは、「コンソールログは“リアルタイム確認用”、ファイルや外部ログは“証拠として残す用”と役割を分けて考える」ことです。
同じ ILogger から、コンソールとファイルの両方に出す構成もよく使われます。


まとめ:コンソールログは「開発とバッチの心強い相棒」

コンソールログの本質は、
アプリの動きを人間がリアルタイムで追いかけられるように、
シンプルなテキストとして画面に出すことです。

押さえておきたいポイントは次の通りです。

日時とレベルを付けるだけで、出力が一気に“ログらしく”なること。
色付きログにすると、重要な行が一瞬で目に入ること。
ASP.NET Core などでは ILogger と AddConsole を組み合わせるのが王道であること。
小さなツールでは、自前の ConsoleLogger ユーティリティを用意するとコードがすっきりすること。
コンソールログは「今すぐ見たい」、ファイルログは「後から読み返したい」という役割で使い分けること。

ここまでイメージできていれば、「とりあえず Console.WriteLine」から一歩進んで、
業務でも通用するコンソールログ設計を意識して書けるようになります。

タイトルとURLをコピーしました