.NET 4.6下NLog 5.2.8对接Elasticsearch 8失败求助
问题
项目环境:
- WebApi .NET 4.6
- NEST 6.2
- Elasticsearch.Net 6.2
- NLog 5.2.8
- Elasticsearch 8
原Elasticsearch 5环境下日志写入正常,现需升级至Elasticsearch 8,但因依赖包限制无法升级.NET版本。测试发现将项目升级至.NET 4.6.1并更新NLog、NEST及Elasticsearch.Net后可正常写入ES8,但当前无法变更.NET版本。
当前.NET 4.6环境下,NLog写入ES8时出现以下错误:
2023-12-31 00:08:08.4356 Error Failed to send log messages to elasticsearch: status=, message="Failed to ping the specified node.. Call: Status code unknown from: HEAD /" 2023-12-31 00:08:08.4356 Trace Failed to send log messages to elasticsearch: result=Unsuccessful low level call on POST: /_bulk 2023-12-31 00:08:08.4556 Error Error while sending log messages to elasticsearch: message="Failed to ping the specified node.. Call: Status code unknown from: HEAD /"
解决方案
1. 强制启用TLS 1.2
.NET 4.6默认未启用TLS 1.2,而Elasticsearch 8默认要求安全连接,需在项目启动时添加以下代码:
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
2. 禁用节点Ping检查
旧版NEST/Elasticsearch.Net的Ping机制与ES8不兼容,可在NLog配置的Elasticsearch目标中添加disablePing="true",跳过节点连通性检测:
<target xsi:type="ElasticSearch" name="elastic" uri="https://your-es-host:9200" disablePing="true" ...其他配置... />
3. 配置正确的身份验证
Elasticsearch 8默认开启安全验证,需在NLog配置中添加身份信息:
- 账号密码验证:
<target xsi:type="ElasticSearch" name="elastic" uri="https://your-es-host:9200" authentication="Basic" username="elastic" password="your-password" ...其他配置... />
- API密钥验证:
<target xsi:type="ElasticSearch" name="elastic" uri="https://your-es-host:9200" headers="Authorization=ApiKey your-api-key" ...其他配置... />
4. 调整索引兼容性设置
旧版NEST创建的索引可能与ES8的映射规则冲突,可在NLog配置中指定索引的兼容参数,或提前在ES8中创建符合要求的索引:
<target xsi:type="ElasticSearch" name="elastic" index="logs-${date:format=yyyy.MM.dd}" type="_doc" includeAllProperties="true" ...其他配置... />
5. 更新NLog Elasticsearch目标版本
确保使用的NLog.Targets.ElasticSearch版本兼容.NET 4.6和Elasticsearch 8,可尝试安装支持.NET 4.6的最新兼容版本(如4.x系列中适配ES8的版本)。
内容的提问来源于stack exchange,提问作者Mostafa Bagheri
相关产品推荐
相关产品推荐

