Serilog需在WebApplication.CreateBuilder前初始化Log.Logger,否则被内置日志抢占;appsettings.json需通过Serilog.Settings.Configuration显式加载Serilog节点;多输出须按级别过滤,控制台限Warning以上,文件保留全量;UseSerilogRequestLogging自动注入请求属性,全局上下文用LogContext.PushProperty,避免高频ForContext创建。
Serilog 默认就支持结构化日志,
中的
会被自动提取为 JSON 字段,不用额外配 layout 或 parser——这点和 NLog 有本质区别,别被“看起来能输出”骗了。
怎么在 Program.cs 里正确初始化 Serilog
必须在
之前调用
,否则 ASP.NET Core 的内置日志提供程序会先占位,导致 Serilog 不生效。
常见错误现象:
注入的是 Microsoft 内置 logger,不是 Serilog 实例,
也无效。
实操建议:
C知道
CSDN推出的一款AI技术问答工具
下载
把
放在
之前
记得在应用退出前调用
(尤其控制台/Worker 项目)
若用
的
,Serilog 会自动接管,无需手动注册
为什么 appsettings.json 配置不生效
包不是开箱即用的“自动加载”,它只读取
节点,且要求你显式调用
。
常见错误现象:改了
里的
,日志级别没变;或
路径没更新。
实操建议:
安装
NuGet 包
在
中加
必须包含完整
节点,例如:
多目标输出时 Debug 日志只该进文件,不该刷屏控制台
默认所有
都接收全量日志,不设限就会让控制台塞满
,而文件里又漏掉关键上下文。
实操建议:
控制台加过滤:
文件保留全量:
Seq 等远程 sink 必须启用结构化传输:
,否则只收到纯文本,
字段为空
用
屏蔽框架日志(可选)
全局上下文和请求级属性怎么加才不漏
是线程本地的,中间件里加了,但没在每个请求开始时触发,就会导致部分日志缺失
或
。
实操建议:
启动时加固定属性:
ASP.NET Core 中,用
中间件(需装
),它会自动注入
、
、
等
自定义属性如
,应在认证后、进入业务逻辑前,用
——别放在 Action 里,否则异步操作可能已脱离作用域
最容易被忽略的是:每次调用
都生成新 logger 实例,高频创建会引发 GC 压力;真正需要子上下文时,优先用
或
。
Log.Information("User {Id} logged in", userId){Id}Host.CreateDefaultBuilderLog.Logger = new LoggerConfiguration()...ILoggerLogContext.PushPropertyLog.Logger = ...CreateLogger()var builder = WebApplication.CreateBuilder(args);Log.CloseAndFlush()Microsoft.Extensions.LoggingILoggerSerilog.Settings.Configuration"Serilog".ReadFrom.Configuration(IConfiguration)appsettings.jsonMinimumLevelWriteTo.FileSerilog.Settings.ConfigurationLoggerConfiguration.ReadFrom.Configuration(builder.Configuration)appsettings.json"Serilog"{
"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
{ "Name": "Console" },
{ "Name": "File", "Args": { "path": "logs/app-.txt", "rollingInterval": "Day" } }
]
}
}WriteToDebug.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning).WriteTo.File("logs/app-.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30).WriteTo.Seq("http://localhost:5341", apiKey: "xxx")Properties.Filter.ByExcluding(Matching.WithProperty("SourceContext", "Microsoft.*"))LogContext.PushPropertyCorrelationIdRequestPathLogContext.PushProperty("App", "OrderService")UseSerilogRequestLogging()Serilog.AspNetCoreRequestPathStatusCodeElapsedUserIdLogContext.PushProperty("UserId", userId)Log.ForContext() LogContextBeginScope