使用NLog向ElasticSearch日志报错:未知参数[_type]
解决NLog写入ElasticSearch 8.x时的
_type参数错误问题 问题根源
ElasticSearch 7.x已废弃文档类型(_type),8.x版本完全移除了该参数的支持。你使用的NLog.Targets.ElasticSearch 7.7.0版本默认仍会在请求元数据中包含_type字段,触发ES返回400非法参数错误。
解决方案
1. 升级NLog.Targets.ElasticSearch包
最新版的NLog ElasticSearch目标已适配ES 7+的无类型要求,直接升级到8.x及以上版本即可解决:
Install-Package NLog.Targets.ElasticSearch -Version 8.0.0或更高
升级后默认停止发送_type参数,无需额外配置。
2. 无法升级时,手动禁用_type字段
若受依赖限制无法升级包,可在NLog配置中显式关闭_type的发送:
XML配置文件(NLog.config)修改
在<target>节点添加includeType="false"属性,同时确保index配置符合ES 8.x格式(无需指定类型):
<target xsi:type="ElasticSearch" name="elastic" uri="http://localhost:9200" index="my-logs-${date:format=yyyy.MM.dd}" includeType="false" <!-- 关键:禁用_type字段 --> layout="${message}" />
代码方式配置
如果用代码而非XML配置,设置ElasticSearchTarget的IncludeType为false:
var elasticTarget = new ElasticSearchTarget { Uri = new Uri("http://localhost:9200"), Index = "my-logs-${date:format=yyyy.MM.dd}", IncludeType = false, // 禁用_type字段 Layout = "${message}" }; LogManager.Configuration.AddRule(LogLevel.Info, LogLevel.Fatal, elasticTarget);
3. 验证配置
修改后重启应用,确认NLog内部日志不再出现400错误,同时在Kibana中:
- 创建对应索引的索引模式(例如
my-logs-*) - 刷新索引后检查是否有日志数据
额外检查项
- 若ES开启身份验证,需在NLog配置中添加
username和password属性 - 检查Docker Compose的ES配置,确保没有严格的索引模板限制导致日志无法写入
内容的提问来源于stack exchange,提问作者Dan McCoy
相关产品推荐
相关产品推荐

