背景
公司内部使用的是springcloud,随着业务逐步扩大,微服务数据也逐步增多,运行平台不仅涉及到腾讯云,超融合,微服务散落在不同的机器上,并且都是部署在docker环境中,日志的查找对于开发运维人员来说,十分困难,还是要进行日志的统一收集管理,方便排查问题,提高效率。
设计思路
在网上看了一些思路,大体差不多,没有说哪个是最好的,主要是适合自己的,就是看下自己的资源情况,这里说的资源情况,不是说服务器,也包括自身所处的环境和技术条件。打个比方,有个方案是使用kubernetes的pod,创建服务的伴生容器filebeat来实时抽取日志。但是公司使用的云平台,用的是腾讯云,或者合作产商的平台,没能力去做自定义的修改设计,只能从基础镜像入手。考虑在服务容器中安装轻量的filebeat进行日志抽取。
架构图
以上这张图画的比较简单,但是也足够表达整个采集流程:
- 将filebeat安装到基础镜像中 ,因此而构建的镜像就包含了filebeat,实时采集服务日志到kafka集群中;
- logstash可以安装好必要插件,就可以从kafka的topic中读取日志数据,可以按需配置过滤条件;
- 过滤完成后将日志数据发送至elasticsearch中进行存储;
- 最后通过kibana来检索日志信息,其中的计算都是通过es的;
整理流程比较简单,但是具体实施还是有蛮多细节的,包括后续该怎么很好的使用日志检索都是需要去研究,因为刚出来,很多开发人员就觉得,查个日志很麻烦,不像linux下敲几个命令就可以出来了。
搭建流程
下面主要是做些简单记录,并不是整个搭建手把手的细节,主要给自己做个笔记:
1.下载filebeat,修改配置文件filebeat.yml,配置filebeat的采集日志路径,和写入kafka集群的基本配置
图中可以看到,我都以环境变量的形式填写,其中我都变量都些在dockerfile中,目的是在云平台可以动态配置。其中重点是topic配置也是动态的,每个服务都要独立的topic,动态的依据是脚本自动识别服务jar包名.。
2.制作完基础镜像后,构建的服务镜像启动后就会采集对应路径的日志信息,在kafka就可看到对应信息,现在需要配置logstash,这里有个注意点,我们需要根据不同的topic,因此来写入es中的不同索引。所以可以模糊匹配filebeat_前缀的topic,写入相同名称的index中。
input {
kafka {
bootstrap_servers => ["xxx.xxx.xxx.xxx:9092,xxx.xxx.xxx.xxx:9092,xxx.xxx.xxx.xxx:9092"]
topics_pattern => "filebeat_.*"
auto_offset_reset => "latest"
decorate_events => true
consumer_threads => 5
codec => "json"
}
}
output {
elasticsearch {
action => "index"
hosts => ["xxx.xxx.xxx.xxx:9200"] # 定义es服务器的ip
index => "%{[@metadata][kafka][topic]}-%{+YYYY.MM.dd}" # 定义索引
}
}
3.上一步完成后,可以在es界面中可以查询到对应的索引数据
4.kibana创建对应的索引:管理-索引模式-创建索引模式,就可以检索到对应的日志信息了
当然,这些都是基础部分,比较简单,难得是怎么把平台用起来,数据怎么应用起来,还有蛮长路要走。
常见问题:
1.每次容器启动,都会重新采集,从日志开头读取,如何获取最新日志即可?
在filebeat配置tail_files: true
2.如果需要filebeat记住采集位置,需要将filebeat中记录文件挂载出来,这样每次容器重启得时候,就会继续上次采集的位置继续。具体为filebeat安装目录下的data/registry/data.json。相反的,如果需要重新读取,可以清除该文件。