如何在ASP.Net Core中为每个类或任务创建独立的Serilog日志
实现单任务独立日志文件配置方案
1. 安装依赖包
先安装NuGet包 Serilog.Sinks.Map,该包支持按日志上下文属性拆分不同输出目标。
2. 修改Serilog JSON配置
替换原有File sink为Map sink,按任务ID拆分日志文件,配置示例如下:
{ "Serilog": { "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Map" ], "MinimumLevel": { "Default": "Warning", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ], "WriteTo": [ { "Name": "Map", "Args": { "keyProperty": "TaskId", "defaultIfKeyMissing": "common", "configure": [ { "Name": "File", "Args": { "rollingInterval": "Day", "fileSizeLimitBytes": 10485760, "path": "c://logs/RDJOBS_{TaskId}_{Date}_{Level}.json", "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog" } } ] } }, { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5421" } } ] } }
3. 业务代码注入任务标识
每个任务启动时,通过LogContext写入唯一的任务ID属性,该属性会自动关联到对应日志文件:
// yourTaskUniqueId为当前任务的唯一标识,可自定义为任务编号、任务名称、GUID等值 using (LogContext.PushProperty("TaskId", yourTaskUniqueId)) { // 此处放置任务执行逻辑,内部输出的所有日志都会归属到当前TaskId对应的日志文件 }
注意说明
- 配置中
Enrich节点必须保留FromLogContext,否则无法识别上下文的TaskId属性 - 没有携带TaskId属性的日志会默认写入
common开头的公共日志文件,不需要公共日志可调整defaultIfKeyMissing配置关闭对应输出 - 原有Seq sink的输出逻辑不受影响,所有日志仍会正常上报到Seq服务
内容的提问来源于stack exchange,提问作者SA_VL
相关产品推荐
相关产品推荐

