为ElasticsearchSink配置failureSink报错的解决方法
修复Serilog ElasticsearchSink配置FileSink作为failureSink的实例化错误
错误原因
你遇到的Cannot create instance of type 'Serilog.Core.ILogEventSink'错误,是因为直接在failureSink中指定FileSink的具体类型不符合Serilog配置系统的解析规则。Serilog配置依赖sink的注册工厂方法,而非直接实例化sink类,FileSink的构造参数无法被配置系统自动解析。
修复步骤
- 确认依赖包:确保项目已安装
Serilog.Sinks.FileNuGet包(未安装的话直接通过NuGet包管理器安装)。 - 调整配置结构:
- 在
Serilog.Using数组中添加Serilog.Sinks.File,让配置系统能找到FileSink的注册逻辑; - 将
failureSink的配置从指定type改为使用Name+Args的结构,和顶级WriteTo的配置方式一致。
- 在
修改后的完整配置
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Elasticsearch", "Serilog.Sinks.File"], "MinimumLevel": { "Default": "Error", "Override": { "Microsoft.Hosting.Lifetime": "Information", "Microsoft.AspNetCore": "Warning", "Microsoft": "Error", "System": "Error", "Quartz": "Error", "GraphQL": "Warning", "Hateoas": "Warning", "MassTransit": "Information" } }, "WriteTo": [ { "Name": "Elasticsearch", "Args": { "nodeUris": "http://17.172.25.115:9200", "indexFormat": "logstash", "templateName": "logstash-template", "emitEventFailure": "WriteToFailureSink, WriteToSelfLog, RaiseCallback", "failureSink": { "Name": "File", "Args": { "path": "failures.txt", "fileSizeLimitBytes": null } } } }, { "Name": "Console", "Args": { "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console", "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}" } } ], "Enrich": [ "FromLogContext" ], "Properties": { "ApplicationName": "AselsanSatComPAMAStatic" } }
原理说明
Serilog配置系统通过Name字段匹配对应的sink扩展方法(比如Name: "File"对应WriteTo.File()),自动处理sink的实例化和参数注入,避免了直接构造FileSink类时的参数不兼容问题,同时保证配置结构的一致性。
内容的提问来源于stack exchange,提问作者rdmzcn
相关产品推荐
相关产品推荐

