【C#】ログ出力の基本|ILoggerとSerilogの使い方

C#/.NET で開発を行う際、ログ出力はアプリケーションの動作確認やトラブルシューティングに欠かせません。.NET には標準で ILogger インターフェースが用意されており、柔軟にログを扱えます。また外部ライブラリの Serilog を組み合わせることで、より高度なログ管理が可能になります。本記事では ILogger の基本と Serilog の導入方法を解説します。

ILoggerの基本

.NET では組み込みのロギング機能として Microsoft.Extensions.Logging が提供されています。ILogger インターフェースを利用すると、ログの出力先を切り替えやすく、標準出力やファイル、クラウドサービスなどに簡単に対応できます。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

class Program
{
    static void Main()
    {
        // DIコンテナを構築
        using var serviceProvider = new ServiceCollection()
            .AddLogging(builder =>
            {
                builder.AddConsole(); // コンソール出力を追加
            })
            .BuildServiceProvider();

        var logger = serviceProvider
            .GetRequiredService<ILogger<Program>>();

        logger.LogInformation("アプリケーション開始");
        logger.LogWarning("注意: 設定ファイルが見つかりません");
        logger.LogError("エラーが発生しました");
    }
}

このように ILogger を使えば、アプリ全体で一貫したログ管理ができます。

ログレベル

ILogger ではログの重要度に応じてレベルを指定できます。

  • LogTrace … 詳細なデバッグ情報
  • LogDebug … 開発時のデバッグ情報
  • LogInformation … 通常の実行状況
  • LogWarning … 注意すべき事象
  • LogError … エラー(処理続行可能)
  • LogCritical … 致命的なエラー

環境に応じてログレベルを調整することで、必要な情報だけを効率よく収集できます。

Serilogの導入

Serilog は強力なサードパーティ製のロギングライブラリです。構造化ログ(JSON形式など)をサポートし、ファイルやデータベース、クラウドへの出力を簡単に設定できます。

NuGet で以下のパッケージを追加します。

dotnet add package Serilog
dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File

Serilogの基本的な設定

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;

class Program
{
    static void Main()
    {
        // Serilog の設定
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
            .CreateLogger();

        using var serviceProvider = new ServiceCollection()
            .AddLogging(builder =>
            {
                builder.ClearProviders();
                builder.AddSerilog();
            })
            .BuildServiceProvider();

        var logger = serviceProvider.GetRequiredService<ILogger<Program>>();

        logger.LogInformation("アプリケーション開始");
        logger.LogError("処理中にエラーが発生しました");
    }
}

この例ではコンソールとファイルの両方にログを出力します。rollingInterval: RollingInterval.Day により、日ごとに新しいログファイルが生成されます。

まとめ

ログ出力は開発・運用の両面で重要な仕組みです。

  • ILogger を使うと一貫したログ管理が可能
  • ログレベルを活用して必要な情報を取捨選択できる
  • Serilog を組み合わせると構造化ログや複数出力先に対応可能

小規模なアプリケーションでも標準の ILogger を活用し、大規模・本番環境では Serilog を導入するのがベストプラクティスです。