C#でログを残す場合、 Serilog は最も人気があり、業務アプリでも標準的に使われています。 ファイル出力・ローテーション・構造化ログ・SQLite出力など、 必要な機能がすべて揃っています。
この記事でわかること
・Serilogの基本構成
・ファイル出力・ローテーション(日次・サイズ)
・構造化ログ(JSON)
・例外ログの残し方
・WPF/WinForms/ASP.NETでの利用
・SQLiteログ(Serilog.Sinks.SQLite)
・業務アプリ向けベストプラクティス
・Serilogの基本構成
・ファイル出力・ローテーション(日次・サイズ)
・構造化ログ(JSON)
・例外ログの残し方
・WPF/WinForms/ASP.NETでの利用
・SQLiteログ(Serilog.Sinks.SQLite)
・業務アプリ向けベストプラクティス
1. Serilogの特徴
- 設定が簡単
- ファイル・SQLite・Console・クラウドなど出力先が豊富
- 構造化ログ(JSON)が強力
- ローテーション(Rolling File)が標準対応
- DIと相性が良い
業務アプリでは「ファイル出力 + ローテーション」が最も使われます。
2. Serilogの基本設定(最小構成)
■ 2-1. Program.cs(コンソール/WPF/WinForms共通)
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File("logs/app.log")
.CreateLogger();
Log.Information("アプリ起動");
これだけで logs/app.log にログが残ります。
3. ローテーション(Rolling File)
ログファイルが肥大化しないように、 日次ローテーション や サイズローテーション を設定します。
■ 3-1. 日次ローテーション
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
"logs/log-.txt",
rollingInterval: RollingInterval.Day
)
.CreateLogger();
ファイル名例:log-2026-04-05.txt
■ 3-2. サイズローテーション(10MBごと)
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
"logs/app.txt",
fileSizeLimitBytes: 10_000_000,
rollOnFileSizeLimit: true
)
.CreateLogger();
4. 構造化ログ(JSON出力)
ログをJSONで残すと、後で解析しやすくなります。
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
"logs/log-.json",
rollingInterval: RollingInterval.Day,
formatter: new Serilog.Formatting.Json.JsonFormatter()
)
.CreateLogger();
ログ解析ツール(Kibanaなど)と相性が良い形式です。
5. 例外ログ(Exception)
Serilogは例外を自動で構造化してくれるため、 例外ログが非常に読みやすいです。
■ 5-1. try-catchで例外ログ
try
{
throw new InvalidOperationException("テスト例外");
}
catch (Exception ex)
{
Log.Error(ex, "エラーが発生しました");
}
■ 5-2. 未処理例外をキャッチ(WPF)
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
Log.Fatal((Exception)e.ExceptionObject, "未処理例外");
};
業務アプリでは必須の設定です。
6. SerilogをDIに登録(ASP.NET / WPF / WinForms)
■ 6-1. ASP.NET Core
builder.Host.UseSerilog((context, config) =>
{
config
.MinimumLevel.Debug()
.WriteTo.File("logs/web-.txt", RollingInterval.Day);
});
■ 6-2. WPF / WinForms(Generic Host)
Host.CreateDefaultBuilder()
.UseSerilog((ctx, cfg) =>
{
cfg.WriteTo.File("logs/app-.txt", RollingInterval.Day);
});
DIと組み合わせると、サービス層でもログが使えます。
7. SQLiteにログを保存(Serilog.Sinks.SQLite)
ログをSQLiteに保存すると、 検索・集計・ダッシュボード化 が簡単になります。
■ 7-1. SQLiteログ設定
Log.Logger = new LoggerConfiguration()
.WriteTo.SQLite("logs/log.db")
.CreateLogger();
テーブルは自動生成されます。
■ 7-2. 検索例(SQLite)
SELECT Timestamp, Level, Message
FROM Log
WHERE Level = 'Error'
ORDER BY Timestamp DESC;
ログビューアを作るのも簡単です。
8. ログの粒度(Level)
| Level | 用途 |
|---|---|
| Verbose | 詳細すぎる情報(デバッグ用) |
| Debug | 開発時のデバッグ情報 |
| Information | 通常の操作ログ |
| Warning | 注意すべき状態 |
| Error | 処理失敗(復旧可能) |
| Fatal | 致命的エラー(アプリ停止) |
業務アプリでは Information / Warning / Error が中心です。
9. 業務アプリ向けベストプラクティス
- ファイル出力 + 日次ローテーションが基本
- 例外ログは必ず残す(未処理例外も)
- 構造化ログ(JSON)で後から解析しやすくする
- SQLiteログで検索・ダッシュボード化
- DIでログをサービス層に渡す
- ログファイルはユーザー書き込み可能なフォルダに置く
まとめ:Serilogは“業務アプリの標準ログ基盤”になる
- 設定が簡単で、出力先が豊富
- 構造化ログが強力で、解析しやすい
- ローテーション・例外ログ・SQLiteログが実務で便利
「ログをちゃんと残したい」「後から調査できるようにしたい」 という現場のニーズに対して、 Serilogは最も実務的で強力な選択肢です。 この記事をベースに、あなたのアプリに最適なログ基盤を設計してみてください。