升级Serilog包后创建LoggerBuilder时Elasticsearch抛出异常
Serilog升级后生产AKS集群抛出CustomAttributeFormatException排查方案
升级的Serilog NuGet包版本
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1" /> <PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.ElasticSearch" Version="8.4.1" /> <PackageReference Include="Serilog.Sinks.Seq" Version="5.2.1" />
问题现象
将上述版本的Serilog包部署到生产AKS集群后,调用.ReadFrom.Configuration(config)扩展方法时抛出System.Reflection.CustomAttributeFormatException异常;本地Docker环境、开发及UAT K8S集群无此问题,降级回旧版本Serilog包后所有环境恢复正常。
已知背景:
- 两个独立微服务升级后均出现该问题
- 微服务基于
mcr.microsoft.com/dotnet/sdk:6.0镜像自动构建 - 微服务基于.NET 6开发,生产环境Elasticsearch版本为v7.17.1
排查方向
1. 对比生产与测试环境的Serilog配置
检查生产环境appsettings.json的Serilog配置,重点排查:
- ElasticSearch sink的配置项(如
IndexFormat、TemplateName、AutoRegisterTemplate等)是否包含特殊字符、非法格式字符串 - 是否存在生产环境独有的配置参数,新版本Serilog对配置格式的校验可能更严格,某些旧环境允许的配置在新版本中触发异常
2. 检查生产Elasticsearch的索引与模板
- 查看Elasticsearch中已存在的Serilog索引模板,确认模板的字段映射、属性是否存在格式错误(如日期格式不合法、字符串属性设置冲突)
- 验证生产环境ES的索引命名规则是否与新版本
Serilog.Sinks.ElasticSearch的要求冲突,新版本可能对索引名称的合法性做了更严格的校验
3. 捕获完整异常堆栈信息
临时调整生产环境日志级别为Debug,获取CustomAttributeFormatException的完整堆栈跟踪,明确:
- 异常是在读取配置阶段触发,还是初始化ES sink时触发
- 异常信息中指向的自定义属性具体对应哪个配置项或程序集
4. 核对生产AKS的.NET运行时环境
- 确认生产AKS节点上的.NET 6运行时版本与开发/UAT环境完全一致,运行时的补丁差异可能导致反射行为不同
- 检查生产容器是否存在程序集缺失,新版本Serilog可能依赖新增的系统程序集,容器镜像的裁剪操作可能导致依赖缺失
5. 验证ES sink版本兼容性
当前使用的Serilog.Sinks.ElasticSearch 8.4.1是为ES 8.x版本设计的,而生产ES为7.17.1,跨大版本可能存在兼容问题:
- 新版本sink可能使用了ES 8.x的API特性,与ES 7.x的响应格式不匹配,触发反射解析异常
- 尝试将
Serilog.Sinks.ElasticSearch降级到适配ES 7.x的最新版本(如7.17.x系列),验证是否解决问题
内容的提问来源于stack exchange,提问作者Cladoo
相关产品推荐
相关产品推荐

