ELK v8.4.1中Logstash同步SQL Server土耳其字符至ES乱码求助
你的问题核心是:Logstash控制台能正确输出土耳其字符,但写入Elasticsearch时变成问号,且ELK 7.x无此问题,Kibana直接插入数据正常。说明数据在Logstash内部是正确的,问题出在Logstash到Elasticsearch的传输环节或8.x版本的默认配置变化。以下是具体排查方向和解决办法:
1. 修正Elasticsearch输出插件的编码配置
Logstash 8.x的elasticsearch输出插件可能默认未显式指定UTF-8编码,导致传输时字符被错误转换。在output块中添加content_type参数:
output { elasticsearch { hosts => ["localhost:9200"] index => "test_index" document_id => "%{id}" user => "logstash_user" password => "password" # 显式指定UTF-8编码 content_type => "application/json; charset=UTF-8" } stdout { codec => rubydebug } }
2. 完善SQL Server JDBC连接参数
虽然控制台输出正确,但SQL Server JDBC驱动的sendStringParametersAsUnicode参数能确保字符串以Unicode格式传输,避免潜在的编码转换问题。修改jdbc_connection_string:
jdbc_connection_string => "jdbc:sqlserver://my-sql-connection-info;encrypt=false;characterEncoding=utf8;sendStringParametersAsUnicode=true"
3. 检查Logstash的JVM编码设置
Logstash的JVM默认编码可能影响字符串处理,在logstash/config/jvm.options文件中添加以下参数,确保JVM以UTF-8处理字符:
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
添加后重启Logstash生效。
4. 验证Elasticsearch索引映射
虽然ES默认使用UTF-8,但需确保索引字段的映射未被错误配置。用Kibana Dev Tools执行以下命令查看映射:
GET test_index/_mapping
确认name、surname字段的类型为text或keyword,且未指定非UTF-8的字符过滤器/分析器。若映射异常,可删除索引重新创建,或更新映射。
5. 排查Logstash内部数据传输日志
开启Logstash的debug日志,查看发送到ES的请求体是否已出现问号:
在logstash/config/logstash.yml中设置:
logging.level: debug
重启Logstash后,查看日志中包含elasticsearch的条目,检查请求体里的字符是否正常。若请求体已乱码,需排查Logstash的过滤器或输入插件的编码处理;若请求体正常,则需检查ES的接收配置(但你Kibana直接插正常,此情况概率极低)。
6. 移除无效的Ruby过滤器
你添加的force_encoding过滤器无意义,因为控制台输出已证明字符串编码正确,强行设置编码反而可能干扰原有处理,建议删除该过滤器。
内容的提问来源于stack exchange,提问作者Startech

