C#とSerilogで例外ログをファイル出力する最小構成

コンピュータ

クラスで例外時ログを記録する機能を付与してみます

プロジェクトの作成

mkdir ILoggerSample01
cd ILoggerSample01
dotnet new console -f net8.0
dotnet add package Microsoft.Extensions.Logging
dotnet add package Microsoft.Extensions.Logging.File --prerelease
dotnet add package Serilog
dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Sinks.File

サンプルコード

ファイル名:Sample.cs

// 
// ログ機能を組み込んだサンプルクラス
// 

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

public class Sample
{
    public ILogger Logger { get; set; } = NullLogger.Instance;

    public void SampleMethod()
    {
        try
        {
            // 例外を発生させます。
            throw new Exception("異常発生");
        }
        catch (Exception ex)
        {
            Logger.LogError(ex, "例外が発生しました");
            throw;
        }
        finally
        {
            // 例外が発生した場合でも実行したい後処理をこちらに記述
        }
    }
}

ファイル名:Program.cs

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Serilog;

class Program
{
    static void Main()
    {
        // Serilog の設定(ファイル出力)
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
            .CreateLogger();

        // ILogger を取得
        using var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddSerilog(); // Microsoft.Extensions.Logging と連携
        });

        Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<Program>();

        logger.LogInformation("アプリケーションを開始しました");
        logger.LogWarning("警告メッセージ");
        logger.LogError("エラーメッセージ");

        var obj = new Sample
        {
            Logger = logger,
        };
        obj.SampleMethod();
        // ログが出力される

        obj.Logger = NullLogger.Instance;
        obj.SampleMethod();
        // ログは出力されないはず。
    }
}

実行

実行すると例外が発生します。

 dotnet run
Unhandled exception. System.Exception: 異常発生
   at Sample.SampleMethod() in X:\csharp\console\ILoggerSample01\Sample.cs:line 17
   at Program.Main() in X:\csharp\console\ILoggerSample01\Program.cs:line 31

ログファイルの内容

2025-06-29 09:24:41.196 +09:00 [INF] アプリケーションを開始しました
2025-06-29 09:24:41.241 +09:00 [WRN] 警告メッセージ
2025-06-29 09:24:41.242 +09:00 [ERR] エラーメッセージ
2025-06-29 09:24:41.247 +09:00 [ERR] 例外が発生しました
System.Exception: 異常発生
   at Sample.SampleMethod() in X:\csharp\console\ILoggerSample01\Sample.cs:line 17

Sampleクラスは任意のLoggerをセットするとログファイルに出力されますが、NullLogger.Instanceがセットされている場合は出力されません。
throw; によって スタックトレースを保持したまま上位に例外を伝播しています。
必要に応じて catch ブロック内で例外を握り潰したり、再処理を行うコードに差し替えることが可能です。
おすすめは、呼び出し元でtry-catchで例外を補足し例外を解決するコードを書くとよろしいかと思います。

コメント