C# Tips | ログ・例外・診断:実行ログ自動化

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

実行ログ自動化は「人間が書くログを“仕組みで書かせる”ことで品質を安定させる技術です」

業務システムでは、ログは“後から原因を追うための生命線”です。 しかし、ログを人間が手書きすると次のような問題が必ず起きます。

ログの書き忘れ ログの粒度が人によってバラバラ 例外時だけログがあるが正常時の流れが分からない 処理開始ログと終了ログのフォーマットが統一されていない

つまり、ログは「人間が書く」から品質が安定しないのです。 そこで必要になるのが 実行ログ自動化、 すなわち「処理の開始・終了・例外を自動でログに残す仕組み」です。

ここでは、初心者でも理解しやすいように、 実行ログ自動化の考え方、コード例、テンプレート、実務での使い方までを 連続した流れで丁寧に解説します。

実行ログ自動化の基本は「処理の前後をラップする」ことです

人間がログを書くのではなく、仕組みが自動で書くようにします

実行ログ自動化の本質はとてもシンプルです。

処理の前後を“ラップ(包む)”して、 開始ログ・終了ログ・例外ログを自動で出す。

例えば、次のような処理があるとします。

public void ProcessUserData()
{
    // 何か処理
}
C#

これを人間がログを書くとこうなります。

_logger.LogInformation("ProcessUserData 開始");
ProcessUserData();
_logger.LogInformation("ProcessUserData 終了");
C#

しかし、これを毎回書くのは面倒ですし、 書き忘れやフォーマットの乱れが必ず発生します。

そこで、処理をラップするユーティリティを作ります。

実務で使える「実行ログ自動化ユーティリティ」のテンプレート

これを使うと、どんな処理でも自動でログが出ます

まずは同期処理をラップするテンプレートです。

using System;
using Microsoft.Extensions.Logging;

public static class ExecutionLogger
{
    public static void Run(string name, Action action, ILogger logger)
    {
        logger.LogInformation("Start: {Name}", name);

        try
        {
            action();
            logger.LogInformation("End: {Name}", name);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "Error: {Name}", name);
            throw;
        }
    }
}
C#

使い方はとても簡単です。

ExecutionLogger.Run("ProcessUserData", () =>
{
    ProcessUserData();
}, _logger);
C#

これだけで、

  • 開始ログ
  • 終了ログ
  • 例外ログ

が自動で出ます。

非同期処理にも対応させる

業務システムでは非同期処理も多いため、 async/await に対応した版も用意しておきます。

public static class ExecutionLoggerAsync
{
    public static async Task RunAsync(string name, Func<Task> action, ILogger logger)
    {
        logger.LogInformation("Start: {Name}", name);

        try
        {
            await action();
            logger.LogInformation("End: {Name}", name);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "Error: {Name}", name);
            throw;
        }
    }
}
C#

使い方は次の通りです。

await ExecutionLoggerAsync.RunAsync("LoadUser", async () =>
{
    await LoadUserAsync();
}, _logger);
C#

実行ログ自動化の重要ポイントを深掘りします

1. ログのフォーマットが統一される

人間が書くログはどうしてもバラバラになります。

「開始」 「Start」 「処理開始」 「BEGIN」

こうした揺れがあると、後からログを分析するときに非常に困ります。 実行ログ自動化を使えば、すべてのログが同じフォーマットで出るため、 ログ解析ツールや grep での検索が圧倒的に楽になります。

2. 例外ログが必ず出る

人間が書くログで最も多いミスは「例外ログの書き忘れ」です。 例外が起きたのにログが残っていないと、原因調査がほぼ不可能になります。

実行ログ自動化では、例外を必ずキャッチしてログに残し、 その後再スローするため、例外ログが必ず残るようになります。

3. 正常系のログも自動で残る

例外ログだけでは「どこまで処理が進んだか」が分かりません。 正常系のログがあることで、

  • どの処理が成功したか
  • どこまで進んでから例外が出たか
  • どの処理が遅いか

といった情報が分かります。

実行ログ自動化は、正常系のログも自動で残すため、 処理の流れが後から追いやすくなります。

4. ログの書き忘れがゼロになる

人間がログを書くと、必ず書き忘れが発生します。 特に忙しいときや修正時にログが抜けると、 後から原因調査が困難になります。

実行ログ自動化を使えば、 ログを書くのはユーティリティだけになるため、 書き忘れがゼロになります。

実務での使いどころ

バッチ処理・API・サービス・業務ロジックなど、すべてに使えます

実行ログ自動化は、次のような場面で特に効果を発揮します。

バッチ処理 → どのステップが遅いか、どこで落ちたかが分かる

API → リクエストごとの処理開始・終了が自動で記録される

Windows サービス → 例外が出てもログが必ず残る

業務ロジック → ログの粒度が統一され、分析しやすくなる

つまり、ログが必要なすべての処理に使える汎用ユーティリティです。

実行ログ自動化をさらに強化する応用例

実行時間も自動でログに残す

パフォーマンス診断のために、 処理時間も自動でログに残すことができます。

public static class ExecutionLogger
{
    public static void Run(string name, Action action, ILogger logger)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        logger.LogInformation("Start: {Name}", name);

        try
        {
            action();
            sw.Stop();
            logger.LogInformation("End: {Name} Elapsed={Elapsed}ms", name, sw.ElapsedMilliseconds);
        }
        catch (Exception ex)
        {
            sw.Stop();
            logger.LogError(ex, "Error: {Name} Elapsed={Elapsed}ms", name, sw.ElapsedMilliseconds);
            throw;
        }
    }
}
C#

これにより、 「どの処理が遅いか」 が自動で分かるようになります。

まとめ:実行ログ自動化は「ログ品質を人間ではなく仕組みで保証する」ためのユーティリティです

実行ログ自動化の本質は、

「処理の開始・終了・例外を自動でログに残し、 ログ品質を人間ではなく仕組みで保証すること」

にあります。

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

処理の前後をラップすることでログを自動化できる 開始・終了・例外ログが必ず残る ログのフォーマットが統一される 書き忘れがゼロになる パフォーマンスログも自動化できる

多くの購読者のみなさんが業務コードを書くとき、 この「実行ログ自動化」を導入するだけで、 ログ品質が劇的に向上し、原因調査が圧倒的に楽になります。

さらに深掘りしたい方は、 ログ設計のベストプラクティス や 例外処理の自動化 も合わせて学ぶと、より強固な診断基盤を構築できます。

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