无法通过配置文件为Serilog配置自定义sink,.NET 5与.NET Core 3.1下均失效
问题根因
Serilog 配置系统通过 WriteTo 节点的 Name 属性匹配的是 LoggerSinkConfiguration 的扩展方法名,而非直接匹配 ILogEventSink 实现类的类名,你目前只实现了Sink类,缺少对应的注册扩展方法,同时存在配置节点拼写错误的问题。
修复步骤
1. 新增自定义Sink的注册扩展方法
在你的项目中新增静态类,编写扩展方法:
namespace SampleApp // 确保命名空间和Sink类一致,或者可以全局访问 { public static class SerilogCounterSinkExtensions { public static LoggerConfiguration SerilogCounter( this LoggerSinkConfiguration loggerConfiguration, LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum, ILogEventFilter filter = null) { // 直接返回你自定义Sink的实例 return loggerConfiguration.Sink(new SerilogCounterSink(), restrictedToMinimumLevel, filter); } } }
2. 修正appsettings.json配置
修正两处错误:
WriteTo节点的Name填扩展方法名SerilogCounter- 把拼写错误的
MinimalLevel改为官方要求的MinimumLevel
修正后的配置如下:
"Serilog": { "Using": [ "SampleApp" ], "WriteTo": [ { "Name": "SerilogCounter" }, { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/log.txt" } } ], "MinimumLevel": { "Default": "Information", "Override": { "System": "Warning", "Microsoft": "Information" } } }
3. 可选优化
你代码中已经手动调用了 .WriteTo.Console(),和配置里的Console注册重复,会导致单条日志输出两次,可以删除代码里的手动Console注册,统一由配置管理所有Sink。
修改后重新运行,即可通过配置触发SerilogCounterSink.Emit方法。
内容的提问来源于stack exchange,提问作者Michael Zagorski
相关产品推荐
相关产品推荐

