如何让Serilog日志记录代码起源位置(文件、行号)?
如何配置Serilog记录日志的起源位置(文件、行号)
要让Serilog记录日志的调用文件、行号等起源信息,需通过启用调用者信息增强和调整输出格式两个关键步骤实现,具体操作如下:
1. 安装必要的NuGet包
首先需要安装Serilog.Enrichers.Caller扩展包,它负责收集调用者的文件、行号等信息:
Install-Package Serilog.Enrichers.Caller # 或使用.NET CLI dotnet add package Serilog.Enrichers.Caller
2. 修改appsettings.json配置
在Serilog配置节点中添加Enrich数组启用调用者信息增强,同时调整输出格式化器确保信息被正确输出:
"Serilog": { "MinimumLevel": { "Default": "Information" }, // 启用调用者信息增强 "Enrich": [ "FromLogContext", "WithCaller", // 记录调用者文件路径 "WithCallerLineNumber",// 记录调用者行号 "WithCallerMemberName" // 记录调用者方法名 ], "WriteTo": [ { "Name": "Console", "Args": { // 自定义控制台输出格式,包含调用者信息 "formatter": "Serilog.Formatting.Display.MessageTemplateTextFormatter, Serilog", "format": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}【调用位置】{Caller}:{CallerLineNumber}{NewLine}{Exception}" } }, { "Name": "File", "Args": { "path": "./logs/log.json", "rollingInterval": "Day", "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog", "restrictedToMinimumLevel": "Warning" } } ] }
配置说明:
Enrich节点的三个WithCaller开头配置项,分别负责收集文件路径、行号、调用方法名;- 控制台输出通过自定义
format模板,将调用者信息直观展示; - JSON文件输出无需额外调整,
JsonFormatter会自动将所有增强字段(如Caller、CallerLineNumber)写入JSON结构。
3. 确认Program.cs初始化代码
你当前的Serilog初始化代码无需修改,它会自动读取配置文件中的增强设置:
builder.Host.UseSerilog( (context, configuration) => configuration.ReadFrom.Configuration(context.Configuration));
注意事项
- 调用者信息收集会带来轻微性能开销,生产环境若对性能敏感,可仅在Debug环境启用该增强,或限制仅对特定日志级别生效;
- 第三方组件(如EF Core)输出的日志,无法获取你的代码层面的调用位置,因为这些日志由组件内部生成,不属于你的代码调用链。
内容的提问来源于stack exchange,提问作者buga
相关产品推荐
相关产品推荐

