背景:经理说之前app直接将日志数据打入到ES里面,侵入性太高了。想要单独只对log文件进行读取后打入ES里面,并且还要将实体对象以json结构进入ES。
我尝试了filebeat读取数据直接打入到ES里面的操作,但是filebeat里面的filter没生效。也尝试过在ES前设置pipeline,也没用(如果你的log文件中本身就是json格式的log,那可以尝试使用pipeline的方式,我跑通过一次,但是因为需要改logback-spring.xml文件,好像还捕获不到异常报错,就没按照这个方案来)
最终尝试filebeat读取数据,logstash加工数据的方式成功了,以下是经验
前提:你已经参照我之前的博文,安装OK了(filebeat/ logstash/elasticsearch/kibana)。
正文:
step1:filebeat.yml文件配置
注意:上面这两个UTF-8可以解决kibana上显示信息编码错误的问题
注意:使用output.logstash,不要使用output.elasticsearch;enable要设置(具体这玩意啥作用我也不知道,没设置的时候logstash会报错,我感觉应该是beats协议的问题)
重新运行filebeat
step2:修改syslog.conf文件
注意:
红色注释掉的地方说明:tcp是之前使用tcp协议传输数据的时候使用的,现在我们改用beats协议了;multiline的作用是为了捕获多行日志。比如异常报错,或者人为打印日志是多行的,他把这些数据整理成一条log日志。为什么不放开呢,是因为logstash不是自带这个插件的,你一开始就是用这个插件,logstash就启动不了了。
if 后面的设置就是说:当message消息中出现记录字样,把这个数据转成json格式。
step3:安装multiline插件,放开注释,重启logstash
进入容器内部后执行下面的命令
./bin/logstash-plugin install logstash-filter-multiline
当显示install successfully的时候,退出容器
再将上面的注释放开
然后重启logstash。
命令:docker restart logstash
step4:程序中打印log前将实体转json格式的字符串
实验结果:大概感受一下就行(涉密全打码了)