前言
最近在做一个ELK的项目,由于数据源是csv文件,而且要考虑定时更新数据源,发现搭建起来的时候都有点这样那样的问题卡手,网上很多教程都是关注某一个点去撰写,所有我想根据这段时间搭建Logstash遇到的一些问题记录下来,和大家分享一下,当然后面如果有更多的发现和心得,还会不断更新此文章。
事前准备
• 操作系统方面,我是用windows 10 作开发环境,用windows server 2016作生产环境,目前暂时还没发现操作系统版本差异引起的问题。
• ELK三个部件,根据之前的项目经验,最好三个版本要一样,比如大家都是7.2.0,不然的话怕有些函数和插件不兼容。
• 网上很多指定的java版本,我反而没用很留意,因为机器自带的就是java 1.8了,不过大家如果运行ELK的时候看日志有提到java版本的话,可以在此方面思考以下。
相关概念解释
• Input 文件里面的file里面的start_position,默认从文本尾开始读取,有两个值可以设,beginning/end,默认是end。
• Input文件里面的file里面有个sincedb_path,这个文件其实是logstash每次读取的某个文件,例如1.xlsx这个excel的时候,产生的临时标志文件,第一次运行logstash读取的时候产生的,里面记录着一些标志信息,文件通常放在‘data\plugins\inputs\file’文件夹,文件名以一串随机生成码命名的,例如【.sincedb_05cb668c5da84a4307bd73ce4b77ef60】。如果以后再次读取这个excel,而这个excel从来没用更改过,那么系统就认为sincedb的临时信息没有修改,所以logstash不会对此excel文件再次读取,所以很多时候大家会看到“Successfully started Logstash API endpoint”之后,就没有然后了。要解决这个现象,例如像每次不管怎样都需要重新读取excel文件的时候,就必须要把这个sincedb删除,那么它就会认为找不到而重新建立一个标志文件。
另外看过网上有大神说如果linux版本可以利用黑洞换一个空值进去,sincedb_path => “/dev/null”,各位用linux的朋友可以试一下。
搭建步骤
1、 先把Elasticsearch和Kibana顺序运行(我是用创建快捷方式运行的)。
2、 启动windows的cmd,弹出控制台,去到logstash路径,如图:
3、 这里要注意一下,国内很多教程,都只说明如何单个导入csv或者json的文件,但由于我们项目特殊性,每次要导入n个文件,从而建立n个index索引,所以我曾经思考过要不每次运行一次 “logstash -f “的指令 ?但有个问题,每次运行了-f 命令之后,当个cmd画面就静止了,意味着,如果我要导入第二个文件又需要重开一个cmd窗口,由于我们项目的宗旨是‘自动化’,尽量让每个一步骤都是机器自动运行,不要加入太多人手的处理,所以后来我访问了一些国外的网站还有官网,得出个结论,就是直接不指定文件而指定conf文件对应的目录,例如:
但这里一定要加”/”,不然的话运行不下去,而且”/”后面千万不要加*,
logstash -f config/,这个写法,是**大错特错***的,一定要注意。至于文件架构,还是建议一个conf文件对应一个csv,不要所有csv都写在一个conf文件里面,这样也不方便维护,因为你要写很多个if。
到这里为止,基本就可以成功运行了,等待时间取决于机器的配置。
搭建的时候遇到的问题
• 在导入时曾经遇到一个比较尴尬的问题,是多个文件导入的时候,不同内容会叠加在一起,也就是说,你建了2个索引,每个索引假定有3条记录,就变了2*3条记录了,这样会造成混乱。所以解决办法是在input file里面的加一个参数,type=xxx,通常这个位置是写文件类型的,但你也可以自由定义。我们看看加与不加得出的结果是什么?
以下是我们要做测试的文件。
- 如果我们不区分type的话,会出现重复:
运行之后会出现重复的记录,后面还有太多,就不一一截图了。
我们可以在kibana看到,一个index里面包含了两个文件的记录
- 如果我们做了区分之后,展示的结果就可以根据filter来区分了
read1.conf
read2.conf
在Kibana里面的显示
• index命名要小写,不然会报error
• 注意表头一定不要在csv里面写,要在conf文件里面写,详情见上面截图的columns和separator设定.
经验总结
• 如果导入多个同类型的文件,也可以写通配符
创建配置文件,然后设定格式为/*.log的方式.
input{
file {
path => “c:/temp/*.log”
start_position => “beginning”
}
}
output {
stdout { }
}
• 尽量不要让ELK对应的机器,装太多其他服务,因为ELK本身也是占很多的资源的,至于ELK要不要分开,那就要结合企业是否需要聚簇或者备份或者资源的多少了。
• 关于path的设定,传统文件是\的,但Logstash是/的,这个一定要注意,如果写反的话,控制台不会有任何响应,然后你就猜大半天了。
留待思考的问题
• 如果我有两个csv文件,无论我在上面用filter区分了,但仍然会合拼一些不同列名的字段,例如上面实验中一个score的字段,一个grade的字段,这个我预期是希望把它们分开的,所以还有待研究中,如果有解决方案,会及时更新此博。
• 关于sincedb_path,如果在windows版本,目前好像还要每次运行的时候delete对应的文件,不想linux那样可以写一个空的文件给它,否则会出block out的错误,那么如果想达到不是每次都删除sincedb_path的做法,应该如何去实现呢?
• 什么场景需要更新方式导入,什么场景需要新建导入,如何可以做到记录,性能的最优化,这个也是需要思考的。