【Visual Studio C# デバッグ入門 】Serilogの使用方法を徹底解説

前回はNLogの使用方法を紹介しましたが、今回はSerilogです。

Serilogも広く使用されており、NLog と同様にログレベル(Verbose, Debug, Information など)の切り分け・ログファイルの出力先・出力形式のカスタマイズなどが簡単に設定できるログライブラリです。

  • 使用環境
    • Windows 10 Pro 2009 ビルド19045.5854
    • Visual Studio 2020 Version 17.14.2
    • Serilog 4.3.0

Visual Studio C# Serilogを使用した本格的なデバッグログ管理

Visual Studio C# Serilogの主な用途

  1. デバッグ
    • Log.Debug()を使って変数の値や処理の流れを記録し、問題の特定を容易にする
  2. エラートラッキング
    • Log.Error()やLog.Fatal()を使ってエラーメッセージやスタックトレースを記録し、原因を分析する
  3. ユーザーアクションの記録
    • ログインやデータ更新の履歴をLog.Information()で記録し、監査やトラブルシューティングに役立てる
  4. パフォーマンス監視
    • アプリケーションの処理時間を測定し、ボトルネックを特定する

Visual Studio C# Serilogのログ出力形式

出力先ファイル形式用 途
コンソール標準出力(テキスト)開発時のデバッグ、リアルタイム監視
2ファイル.txt .log .json .csv .xmlログの保存・分析・長期記録
データベースSQLテーブル監査ログ・履歴管理・検索性向上
クラウドJSON, XML, Parquet分析・可視化、クラウドサービス連携
イベントログWindows Event Logシステム監視、セキュリティログ
メッセージキューKafka, RabbitMQ分散システムのログ管理
リモートサーバSyslog, HTTP API集中管理、ログ集約
メール通知HTML, Plain Text重要なエラー通知
チャットツールSlack, Tearms, Discord運用チームへの即時通知

Visual Studio C# Serilogのログレベル一覧(レベルの低い順)

順位レベル機 能
1Verbose最も詳細なログレベル。すべての動作を記録
2Debug開発・トラブルシュート用
3Information主要なイベント(起動、終了、処理完了など)を記録
4Warning警告(問題の可能性あり)
5Errorエラー(処理が失敗した場合、例外情報も含む)
6Fatal致命的なエラー(アプリケーションがクラッシュするような重大な問題)

Visual Studio C# Serilogの使用手順

NuGet Serilogパッケージのインストール

  • ソリューションエクスプローラー画面の「プロジェクト」を右クリック→「NuGetパッケージの管理」画面から下記のパッケージをインストールします。
    • Serilog 4.3.0
    • Serilog.Sinks.Console 6.0.0
    • Serilog.Sinks.Debug 3.0.0
    • Serilog.Sinks.File 7.0.0

■パッケージのインストール結果

Visual Studio C# Serilogの初期設定

アプリケーションの開始時、通常は「Main」やアプリケーションの初期化時にSerilogを設定します。

■設定例

 public Form1()
{
    InitializeComponent();
    // フォームを画面の中央に表示
    this.StartPosition = FormStartPosition.CenterScreen;

    //---------------------------------------------------------------------------------
    // Serilogの初期設定
    //---------------------------------------------------------------------------------

    // LoggerConfiguration インスタンスの作成
    Log.Logger = new LoggerConfiguration()

    // 出力先の設定 コンソール/デバッグウィンドウ/ログファイル
    .WriteTo.Console()
    .WriteTo.Debug()

    //rollingInterval: RollingInterval.Day ログファイルを日ごとに作成
  //ログファイルにはWarningレベル以上のログが記録される
    .WriteTo.File(@"C:\temp\Serilog\serilog_code.txt", 
                restrictedToMinimumLevel: LogEventLevel.Warning, 
                rollingInterval: RollingInterval.Day)

    //コンソール・デバッグウィンドウには、Debugレベル以上のログが記録される
    .MinimumLevel.Debug()
    .CreateLogger();

}
  • 出力先の設定
    • 本設定では、コンソールとデバッグウィンドウ及びログファイル
  • 出力レベルの設定
    • 両方のウィンドウにはDebugレベル以上のメッセージを出力(.MinimumLevel.Debug())
    • ログファイルにはWarningレベル以上のメッセージを出力(restrictedToMinimumLevel: LogEventLevel.Warning,)
  • ログファイルの作成周期
    • 一日ごとに別ファイルとして作成(rollingInterval: RollingInterval.Day)

ログ出力先の設定例

  • コンソール
    • .WriteTo.Console()
  • デバッグウィンドウ
    • .WriteTo.Debug() 
  • ファイル出力
    • .WriteTo.File(@”C:\temp\Serilog.txt”, restrictedToMinimumLevel: LogEventLevel.Warning,
      rollingInterval: RollingInterval.Day)
  • SQL Server
    • .WriteTo.MSSqlServer(“Server=myServer;Database=myDB;User Id=myUser;Password=myPassword;”, “Logs”)
  • Elasticsearch
    • .WriteTo.Elasticsearch(new Serilog.Sinks.Elasticsearch.ElasticsearchSinkOptions(new Uri(“http://localhost:9200”)))
  • Syslog(Linux向け)
    • .WriteTo.Syslog()
  • メール通知
    • .WriteTo.Email(new EmailConnectionInfo{FromEmail = “noreply@example.com”,ToEmail = “admin@example.com”,MailServer = “smtp.example.com”})
  • Slack通知
    • .WriteTo.Slack(“https://hooks.slack.com/services/your/webhook/url”)

ファイル出力設定の主な設定項目一覧

ファイル出力設定では、さまざまなオプションを指定できます。以下に、主な設定項目を一覧にまとめました。

設定項目説 明設定例
Pathログファイルの保存場所“C:/logs/Serilog.txt”
2rollingIntervalローテーション間隔RollingInterval.Day
3retaindFileCour保持するログファイルの最大数7(7日分)
4fileSizeLimitByteログファイルの最大サイズ10485760(10MB)
5buffered書き込みのバッファリングtrue(バッファリング有効)
6flushToDiskIntervalディスクへの書き込み間隔TimeSpan.FromSeconds(5)
7outputTemplateログのフォーマット{Timestamp:yyyy-MM-dd}
8fotmatterJSON形式等のフォーマット指定new CompactJsonFotmatter()
9restrictedToMinimumLevel出力する最低ログレベルLogEventLevel.Warning

■設定例

  • 下記設定では、1日ごとにログファイルを作成し、最大7日分保持10MBを超えたら新しいファイルを作成するようになっています。
  • また、Warning以上のログのみ記録され、バッファリングを有効化してパフォーマンスを向上させています。
Log.Logger = new LoggerConfiguration()
    .WriteTo.File("logs/log.txt",
        rollingInterval: RollingInterval.Day,  // 日毎にログファイルを作成
        retainedFileCountLimit: 7,        // 7日文のログを保持
        fileSizeLimitBytes: 10485760,      // 10MBを超えたら新しいファイルを作成
        buffered: true,             // バッファリングを有効化
        flushToDiskInterval: TimeSpan.FromSeconds(5), // ディスクへの書き込み間隔 5秒
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}",  
        // ログの表示例 2025-06-08 12:33:20 [Error] データベース接続エラー
        // {NewLine}{Exception}:例外が発生した場合、詳細なスタックトレースを表示
        restrictedToMinimumLevel: LogEventLevel.Warning) // Warning以上のログのみ記録
    .CreateLogger();

Visual Studio C# JSONファイルによるSerilogの設定

  • 設定をJSONファイルで管理する利点
    • ソースコードを変更せずにログの設定が可能となる
    • 環境ごとに異なる設定を利用する事ができる(例:serilog.dev.json、serilog.prod.json等)

上記だけでも利便性は相当に高いと言えます。

■serilog.jsonの例

この設定では、コンソールにはDebugレベル以上ファイルにはWarningレベル以上のログを出力するようにしています。

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "Console",
        "Args": { "restrictedToMinimumLevel": "Debug" }
      },
      {
        "Name": "File",
        "Args": {
          "path": "C:/temp/Serilog/serilog_json.txt",
          "rollingInterval": "Day",
          "restrictedToMinimumLevel": "Warning"
        }
      }
    ],
    "Enrich": [ "WithMachineName", "WithThreadId" ]
  }
}

設定手順

  • serilog.jsonの作成
    • プロジェクトのルートディレクトリ(binフォルダの外)に作成します
      内容は上記通り。
  • JSON設定の読み込み
    • C#のコードでJSONファイルを読み込むには下記のパッケージが必要となるので、NuGetパッケージからインストールします。
      • Microsoft.Extensions.Configuration.Json
      • Serilog.Settings.Configuration
  • serilog.jsonファイルのプロパティ設定
    • ファイルを「右クリック」→「プロパティ」でプロパティを表示し、下記項目を設定
      • ビルドアクション:コンテンツ
      • 出力ディレクトリコピー:新しい場合はコピーする
  • プロパティの設定の意味
    • ビルド時に設定ファイルを bin フォルダへコピー
    • 実行時に serilog.json を参照できる(アプリが正しくログ出力できる)
    • ファイルが変更された場合のみコピーされるため、不要な更新を防ぐ

Visual Studio C# Serilog 動作確認

Serilogの「コード内」設定と「JSONファイル」設定も、下記の簡単なプログラムコードを実行して検証します。

  • 設定した条件
    • コンソール画面には、Debugレベル以上のエラーを出力する
    • ログファイルには、Warningレベル以上のエラーを出力する
using Serilog;
using Serilog.Events;

//---------------------------------------------------------------------------------
// Serilogの初期設定
//---------------------------------------------------------------------------------
try
{ 
    // LoggerConfiguration インスタンスの作成
    Log.Logger = new LoggerConfiguration()

    // 出力先の設定 コンソール/デバッグウィンドウ/ログファイル
    .WriteTo.Console()
    .WriteTo.Debug()

    //rollingInterval: RollingInterval.Day ログファイルを日ごとに作成
    .WriteTo.File(@"C:\temp\Serilog\serilog_code.txt",
            restrictedToMinimumLevel: LogEventLevel.Warning,
            rollingInterval: RollingInterval.Day)

    //Debug 以上のログレベルのログが記録される
    .MinimumLevel.Debug()
    .CreateLogger();

    Log.Information("Information:コード内の、Serilog設定が適用されました。Fileには表示されない。");
    Log.Verbose("Verbose:ログに表示されないメッセージ。Fileには表示されない。");
    Log.Debug("Debug:プログラムが開始しました。");
    Log.Warning("Warning:警告エラーメッセージ");

    for (int i = 0; i < 10; i++)
    {
        int doubled = i * 2;
        //logger.Info($"NLog ループ {i}:2 倍の値 = {doubled}");
        Log.Debug($"ループ {i}:2倍の値 = {doubled}" + " Fileには表示されない。");
    }

    // 故意に例外を発生させるためのコード
    int val_1 = 10;
    int val_2 = 0;
    int result = val_1 / val_2;
}
catch (Exception ex)
{
    // 例外が発生した場合
    Log.Error(ex, "Error:アプリケーションでエラーが発生しました");
    Log.Fatal(ex, "Fatal:アプリケーションで致命的なエラーが発生しました");
}
finally
{
    // アプリケーション終了時のログ
    Log.Information("プログラムが終了しました");
}

Visual Studio C# コード内でSerilogを設定した場合

下記の出力結果を見ると、想定通りに動作した事が確認できました。

■コンソール画面への出力結果

■ログファイルへの出力結果

Visual Studio C# JsonファイルでSerilogを設定した場合

■コンソール画面への出力結果

■ログファイルへの出力結果

Visual Studio C# Serilog まとめ(NLogと比較して)

NLogとSerilogはどちらもC#のログ記録ライブラリとして広く使われていますが、それぞれに優れた点デメリットがあります。

一般的に、NLogはレガシーシステムや高パフォーマンスを求めるアプリケーションで使われることが多く、Serilogはクラウド環境や構造化ログを活用するプロジェクトで人気があります。

最近では、Serilogの採用が増えている傾向があるようですが、用途によって適したライブラリを選択する事が重要です。

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