Bamba news

Serilogとは?C#/.NET向けの構造化ログライブラリを徹底解説

C#/.NET開発者必見!高機能ロギングライブラリ「Serilog」の基本的な使い方から、appsettings.jsonによる設定、複数の出力先(シンク)の活用法まで、サンプルコードを交えてわかりやすく解説します。構造化ログで開発効率を向上させましょう。

Tags:#開発

Serilogとは?

Serilogは、C#や.NETフレームワークで広く使われている、非常に高機能な「ロギングライブラリ」です。ロギングとは、アプリケーションの動作状況を記録としてファイルやコンソールに出力することで、開発中のデバッグや運用時のエラー追跡に不可欠な仕組みです。

Serilogの最大の特徴は「構造化ログ」に対応している点です。従来のログは単なるテキストの羅列でしたが、構造化ログでは、ログデータを「JSON」のような整理された形式で出力します。これにより、後からログの内容を検索したり、データを分析・可視化したりすることが格段に簡単になります。

この記事では、Serilogの基本的な使い方から、より実践的な設定方法までを、サンプルコードを交えて丁寧に解説します。


Serilogの基本的な使い方

まずは、Serilogをプロジェクトに導入し、基本的なログを出力するまでの手順を見ていきましょう。

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

最初に、プロジェクトにSerilogを導入するためのパッケージをインストールします。Visual Studioの「パッケージマネージャーコンソール」を開き、以下のコマンドを一つずつ実行してください。

Install-Package Serilog
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
  • Serilog: Serilogライブラリ本体です。
  • Serilog.Sinks.Console: ログをコンソール(コマンドプロンプトのような画面)に出力するための追加機能です。
  • Serilog.Sinks.File: ログをファイルに出力するための追加機能です。

Serilogでは、ログの出力先(コンソール、ファイル、データベースなど)を「シンク(Sink)」と呼び、必要なシンクをパッケージとして追加していくことで機能を拡張します。

2. ロガーの設定

次に、アプリケーション起動時にSerilogの設定を行います。ここでは、コンソールアプリケーションの Program.cs に設定を記述する例を紹介します。

using Serilog;
using System;

class Program
{
    static void Main(string[] args)
    {
        // Serilogロガーの設定
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information() // Informationレベル以上のログを記録
            .WriteTo.Console() // ログをコンソールに出力
            .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) // ログをファイルに出力(日次でファイルを分割)
            .CreateLogger();

        Log.Information("アプリケーションを開始しました。");

        try
        {
            // ここにアプリケーションのメインの処理を記述します
            // 例: int result = 10 / 0; // わざとエラーを発生させる
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "予期せぬ重大なエラーが発生しました。");
        }
        finally
        {
            // アプリケーション終了時にログを確実に書き出すための処理
            Log.CloseAndFlush();
        }
    }
}

この設定のポイントは以下の通りです。

  • .MinimumLevel.Information(): Informationレベル以上の重要度を持つログのみを記録対象とします。Debugレベルのログは記録されません。
  • .WriteTo.Console(): ログをコンソールに出力するように設定します。
  • .WriteTo.File(...): ログをファイルに出力します。
    • "logs/log.txt": logsフォルダの中にlog.txtという名前でログファイルが作成されます。
    • rollingInterval: RollingInterval.Day: log20250607.txtのように、日ごとに新しいログファイルが作成されるようになります。これにより、ログファイルが巨大になりすぎるのを防ぎます。

3. ログの出力

設定が完了すれば、アプリケーション内のどこからでも簡単にログを出力できます。

// 様々なレベルでログを出力
Log.Debug("これはデバッグ情報です。開発中にのみ役立ちます。");
Log.Information("これは情報メッセージです。処理の開始や終了を示します。");
Log.Warning("これは警告メッセージです。問題が発生する可能性があります。");
Log.Error("これはエラーメッセージです。処理が失敗しました。");

// 構造化ログの出力例
var user = new { Id = 123, Name = "Taro Yamada" };
Log.Information("新しいユーザーが登録されました: {@User}", user);

最後の行が「構造化ログ」の例です。{@User} のように @ を付けてオブジェクトを渡すと、Serilogはオブジェクトの情報をJSON形式で記録します。

通常のログ出力例(コンソール):

[11:49:25 INF] 新しいユーザーが登録されました: { Id: 123, Name: "Taro Yamada" }

ファイルに出力されるJSON形式のログ例:

{"Timestamp":"2025-06-07T11:49:25.1234567+09:00","Level":"Information","MessageTemplate":"新しいユーザーが登録されました: {@User}","Properties":{"User":{"Id":123,"Name":"Taro Yamada"}}}

このようにデータが構造化されているため、「User.Id123のログだけを検索する」といった高度なログ分析が容易になります。


高度な設定と活用方法

Serilogの魅力は、その柔軟な設定と拡張性にあります。

appsettings.jsonによる設定の外部化

プログラム内に直接設定を書き込むのではなく、appsettings.json という設定ファイルに記述することで、アプリケーションを再コンパイルすることなくログの設定(レベルや出力先など)を変更できるようになります。これは、開発環境と本番環境でログの設定を変えたい場合に非常に便利です。

1. appsettings.json ファイルの作成

{
  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/applog-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
        }
      }
    ],
    "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"]
  }
}

2. プログラムで設定ファイルを読み込む

appsettings.jsonから設定を読み込むには、Serilog.Settings.Configurationパッケージを追加でインストールする必要があります。

Install-Package Serilog.Settings.Configuration

そして、Program.csを以下のように修正します。

using Serilog;
using Microsoft.Extensions.Configuration;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // appsettings.json を読み込む設定
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        // 設定ファイルからSerilogの設定を読み込む
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

        // ... 以降のロジックは同じ ...
    }
}

複数の出力先(シンク)の利用

Serilogは、ログを同時に複数の場所へ出力できます。例えば、開発中はコンソールでリアルタイムに確認しつつ、ファイルにも記録し、さらにログ分析用のサーバー(SeqやElasticsearchなど)にも送信するといったことが可能です。

Seqシンクを追加する場合の例です。

1. Seqシンクのインストール

Install-Package Serilog.Sinks.Seq

2. ロガーの設定

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console() // コンソールに出力
    .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) // ファイルに出力
    .WriteTo.Seq("http://localhost:5341") // Seqサーバーに送信
    .CreateLogger();

このように .WriteTo を繋げていくだけで、簡単に出力先を追加できます。

ログレベルごとのファイル出力

「通常の情報ログ」と「緊急性の高いエラーログ」を別々のファイルに分けて保存したい場合があります。Serilogなら、そのような設定も簡単です。

using Serilog;
using Serilog.Events;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information() // 全体としての最低レベル
    .WriteTo.File(
        "logs/info-.log",
        rollingInterval: RollingInterval.Day,
        restrictedToMinimumLevel: LogEventLevel.Information) // Informationレベル以上のログ
    .WriteTo.File(
        "logs/error-.log",
        rollingInterval: RollingInterval.Day,
        restrictedToMinimumLevel: LogEventLevel.Warning) // Warningレベル以上のログ
    .CreateLogger();

Log.Information("これはinfo.logとerror.logの両方に出力されます。");
Log.Warning("これはerror.logにのみ出力されます。");
Log.Error("これもerror.logにのみ出力されます。");

この設定では、InformationレベルとWarningレベルのログはinfo-.logに、Warningレベル以上の(つまりWarning, Error, Fatal)ログはerror-.logにそれぞれ出力されます。これにより、エラー発生時に原因を調査する際、エラーログだけを効率的に確認できます。


まとめ

Serilogは、単にテキストを記録するだけでなく、「構造化ログ」という強力な機能によって、ログの活用範囲を大きく広げるライブラリです。

  • 柔軟な設定: コードまたは設定ファイルで、ログレベルや出力先を細かく制御できます。
  • 豊富なシンク: コンソールやファイルはもちろん、データベースやログ分析ツールなど、多様な出力先に対応しています。
  • 構造化ログ: ログデータを意味のある情報として記録し、後の検索や分析を容易にします。

効果的なログ管理は、アプリケーションの品質向上と安定運用のために不可欠です。C#/.NETで開発を行う際には、Serilogの導入を検討することで、開発効率と運用効率を大幅に向上させることができるでしょう。

関連する記事

Pollyとは?.NETの回復性ライブラリを徹底解説【初心者向け】

.NET開発者必見!Pollyライブラリを使えば、リトライやサーキットブレーカーなどの回復性パターンを簡単に実装できます。本記事では、Pollyの基本的な使い方からHttpClientFactoryとの連携、高度な戦略まで、コード例を交えてわかりやすく解説します。

Difyとは?AIアプリ開発を誰でも簡単に。仕組みや使い方をやさしく解説

プログラミング不要でAIアプリが作れると話題の「Dify」。この記事では、Difyとは何か、その仕組みや料金、具体的な使い方、ビジネスでの活用事例まで、専門用語を避けてわかりやすく解説します。AI開発の第一歩を踏み出したい方におすすめです。

Azure AI Foundryとは?Azure OpenAIモデルをビジネスに活かす方法を徹底解説

Azure AI Foundry(旧Azure AI Studio)で、GPT-4oなどのAzure OpenAIモデルをどう使うの?この記事では、専門用語を避け、AIモデルの準備から具体的な活用事例まで、誰にでも分かるようにやさしく解説します。ビジネスにAIを取り入れたい方必見です。

Amazon Lexとは?Alexaの技術で誰でも簡単にチャットボットが作れるAWSのサービスを徹底解説

Amazon Lexは、Alexaと同じ技術を使った対話AI(チャットボット)開発サービスです。プログラミングの知識が少なくても、音声やテキストで対話するボットを簡単に作成できます。本記事では、その仕組み、特徴、料金体系、活用事例まで、初心者にも分かりやすく解説します。

AWS IoT Coreとは?仕組みから活用例まで、初心者にもわかりやすく解説

「IoTを始めたいけど、何から手をつけていいかわからない…」そんな方へ。AWS IoT Coreは、IoTデバイスとクラウドを安全かつ簡単につなぐためのサービスです。この記事では、AWS IoT Coreの基本的な仕組みから、具体的な活用例、気になる料金体系まで、専門用語を避けて丁寧に解説します。

Bamba news