クラスで例外時ログを記録する機能を付与してみます
プロジェクトの作成
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
で例外を補足し例外を解決するコードを書くとよろしいかと思います。
コメント