C#でILoggerを使い、テキストファイルにログを取る

ソフトウェアを動作させるとき、動作状況をログとして、テキストファイルに出力することがあります。
今までは、自作のメソッドを使っていました。
しかし、知人がILoggerを使ったサンプルをくれました。
それがどうも使いにくいのです。

そこで、Copilotに質問しながら、最小限のC#サンプルを作ってみました。

前提

C#のWindowsフォームアプリで作ります。

ドメイン駆動設計で実現したいので、Presentation層とUseCase層(≒Application層)のプロジェクトをそれぞれ用意しました。Presentationプロジェクトの参照マネージャで、UseCaseプロジェクトに依存を示すチェックを入れています。

この辺りが良く分からない方は、ここを読み飛ばしても多分、動作すると思います。
ちょっとかじってみたい方は次の記事をどうぞ。

Form1のコード

Presentationプロジェクトには既にForm1があると思います。
そこに、Buttonを1つ配置してください。

また、F7キーを押してエディタを開き、以下のコードを貼り付けて下さい。

using Microsoft.Extensions.DependencyInjection;
using Serilog;
using UseCase;

namespace LoggerSample
{
    public partial class Form1 : Form
    {
        private readonly ServiceCollection _services = new();
        public Form1()
        {
            InitializeComponent();

            // Serilog の設定
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Debug() // VS 出力ウィンドウ
                .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day, 
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}")
                .CreateLogger();
            _services.AddLogging(builder =>
            {
                builder.AddSerilog();
            });
            _services.AddSingleton<Class1>();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            var class1 = _services.BuildServiceProvider().GetService<Class1>();
            class1!.Execute();
        }
    }
}

次に、ソリューションエクスプローラのプロジェクト名を右クリックし、「NuGet パッケージの管理」から以下の6パッケージをインストールしてください。

Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Logging
Serilog
Serilog.Extensions.Logging
Serilog.Sinks.Debug
Serilog.Sinks.File

このフォームは、コンストラクタで、ログをテキストファイルに出力する設定をしています。このとき、Serilogというパッケージを使います。また、Class1クラスに依存性注入を行うための設定もしています。(出力ウィンドウにも出力される設定もされている)

また、button1をクリックすると、Class1にロガーの依存性を注入し、Executeメソッドを実行します。

Class1のコード

ライブラリプロジェクトとしてUseCaseを作ると、既にClass1.csがあると思います。そこに、以下のコードを貼り付けて下さい。

using Microsoft.Extensions.Logging;

namespace UseCase
{
    public class Class1(ILogger<Class1> logger)
    {
        private readonly ILogger _logger = logger;
        public void Execute()
        {
            _logger.LogInformation("Hello Logger!");
            _logger.LogWarning("注意メッセージ");
            _logger.LogError("エラーが発生しました");
        }
    }
}

次に、「NuGet パッケージの管理」から次の1パッケージをインストールしてください。

Microsoft.Extensions.Logging

このClass1は、プライマリコンストラクタでILoggerが注入され、Executeが実行されると、Information、Warning、Errorレベルのログが出力されます。

出力結果

exeのあるフォルダの下に、logs/log-yyyyMMdd.txtというファイルができます。

中を開けると、日時、ログレベル、ログ内容が出力されていることが確認できます。

2026-02-14 23:00:56 [Information] Hello Logger!
2026-02-14 23:00:56 [Warning] 注意メッセージ
2026-02-14 23:00:56 [Error] エラーが発生しました

また、デバッグ中の出力ウィンドウにも出力されます。

[23:00:56 INF] Hello Logger!
[23:00:56 WRN] 注意メッセージ
[23:00:56 ERR] エラーが発生しました

フォーマットがちょっと異なるんですね。

まとめ

C#で、ILoggerを使い、テキストファイルにログを出力することができました。
EdgeのCopilotがなければ、とてもこの結果を得ることはできませんでした。
現時点でも、ログのレベルという点に心理的抵抗がありますが、これがスタンダードのようですので、徐々に慣れていこうと思います。

コメント

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