Serilog を使用したログ出力

July 6, 2025 8:1

使用するパッケージ

Serilog(本体:必須)
Serilog.Sinks.Console(コンソールにログ出力する場合)
Serilog.Sinks.Debug(Visual Studio のデバッグウィンドウにログ出力する場合)
Serilog.Sinks.File(ファイルにログを出力する場合)
Serilog.AspNetCore(ASP.NET Core で使用する場合)
Serilog.Enrichers.Thread(スレッドIDをログに出力する場合)

基本のサンプルコード

// Program.cs
Log.Logger = new LoggerConfiguration()
     .MinimumLevel.Information()
     .WriteTo.Console() // コンソールに出力する場合
     .WriteTo.Debug()   // Visual Studio のデバッグウィンドウに出力する場合
     .CreateLogger();

Log.Information("テスト");

ASP.NET Core での利用

// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();  // パッケージ Serilog.AspNetCore が必要

Razor Pages/Controller(*.cs)

ILogger Logger { get; set; }

/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="logger"></param>
public ○○○(ILogger<○○○> logger)
{
    Logger = logger;
}

Logger.LogInformation("ログ出力");

ファイルへの出力

// Program.cs
Log.Logger = new LoggerConfiguration()
     .ReadFrom.Configuration(builder.Configuration)
     .WriteTo.Console() // コンソールに出力する場合
     .WriteTo.Debug()   // Visual Studio のデバッグウィンドウに出力する場合
     .CreateLogger();

Log.Information("テスト");
// appsettings.json
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/hoge/log/Web/web-.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

以下のように出力される。

C:\var\hoge\log\Web\web-20220420.txt

2022-04-20 16:23:21.921 +09:00 [INF] テスト

スレッドIDをログに出力

パッケージ「Serilog.Enrichers.Thread」を追加

// appsettings.json
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/hoge/log/Web/web-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{ThreadId}] {Message}{NewLine}"
        }
      }
    ],
    "Enrich": [ "WithThreadId" ]
  }
}

出力結果

2022-04-21 09:10:01.188 [1] Application started. Press Ctrl+C to shut down.
2022-04-21 09:10:01.188 [1] Hosting environment: "Development"
・・・・

※ ASP.NET Core では async を多用して、単一リクエストでも複数スレッドが使用されるケースが多いのでスレッドIDをログに出力する意味はあまりないかも。

その他のカスタム情報(ユーザーIDなど)をログに出力

LogContext.PushProperty を使用する。

public class UserInfoLoggingMiddleware
{
    private readonly RequestDelegate _next;

    public UserInfoLoggingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        var user = httpContext.User;
        if (user?.Identity?.IsAuthenticated ?? false)
        {
            LogContext.PushProperty("UserId", user.GetUserId());
        }

        await _next(httpContext);
    }
}

// Program.cs

app.UseAuthentication();
app.UseAuthorization();

app.UseMiddleware<UserInfoLoggingMiddleware>();

"Enrich": [ "FromLogContext" ] の追加と、outputTemplate に LogContext.PushPropertyで指定した名称を設定する。

// appsettings.json
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/var/hoge/log/Web/web-.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{UserId}] {Message}{NewLine}"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ]
  }
}