You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:25:26