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" ]
}
}