使用logstash输出到elasticsearch中文乱码的解决方案
logstash版本为5.5.3,elasticsearch版本有两个,分别为2.3.0和5.5.3;其中elasticsearch-2.3.0运行在windows机器上,elasticsearch-5.5.3运行在linux机器上。logstash运行在windows机器上。本文所探讨的由logstash输出到elasticsearch所导致的中文乱码问题,其根本原因是操作系统编码不一样的问题。而出现乱码时,logstash运行在windows环境中;不管elasticsearch运行在windows还是linux中,只要logstash运行在windows中并且你没有在conf启动文件的input模块设置正确的编码的话,就会乱码。
我的logstash的启动文件是这样配置的:
input { kafka { bootstrap_servers => ["192.168.110.31:9092,192.168.110.31:9093,192.168.110.31:9094"] client_id => "test" group_id => "test" auto_offset_reset => "latest" consumer_threads => 5 decorate_events => true topics => ["test","loge"] } } filter{ //....... } output { elasticsearch { //....... } stdout { codec => json_lines } }
当我刚开始发现elasticsearch里面的中文乱码时,我第一时间排查原因,首先我得弄清楚是不是kafka中数据本来就是乱码的,然后我在idea中编写了一个消费者程序将数据取出来,发现正常显示并没有乱码;紧接着测试logstash从kafka中读取出来是否乱码,我再次启动logstash,然后控制台打印的中文也正常;但去elasticsearch查询中文就乱码,我也知道是字符集问题,但是不知道在哪里设置;幸好logstash的各个模块里面有一个通用配置属性是codec,默认为plain,里面可以设置编码,刚开始我以为是在存入elasticsearch时乱码的,所以就把codec => plain{ chaset => "编码"}这句放在output里面的elasticsearch模块里,但是不管我设置成utf-8还是gbk还是iso-8859-1,最后还是乱码。所以我把问题定位在input模块,应该是要在读取kafka数据时设置正确的编码,然后按下面这么改就OK了:
input { kafka { bootstrap_servers => ["172.31.11.31:8071,172.31.11.31:8072,172.31.11.31:8073"] client_id => "test" group_id => "test" auto_offset_reset => "latest" consumer_threads => 5 decorate_events => true topics => ["test","loge"] codec => plain{ charset => "GBK" } //关键是这一句决定存入elasticsearch中文是否乱码 } }
output里面不用设置;当我这样设置以后,我再次启动logstash,发现logstash控制台中文开始乱码,我赶紧去elasticsearch里面查询,发现中文反而是正常的。所以在windows中运行logstash时,如果出现中文乱码,记得在input模块里加codec => plain{ charset => "GBK" } ,现在看来logstash控制台如果不乱码,存入elasticsearch就乱码;logstash控制台乱码,存入elasticsearch就不乱码。
注意:如果你logstash和elasticsearch都运行在linux上就不用设置,中文不会乱码。如果你logstash运行在windows上,那么不管elasticsearch在windows还是linux上,都要设置编码。我没有测试logstash在linux上,elasticsearch在windows上的情况。
更多推荐
所有评论(0)