微服务系列之分布式日志 ELK

1.ELK简介
ELK是ElasticSearch+LogStash+Kibana的缩写,是现代微服务架构流行的分布式日志解决方案,旨在大规模服务的日志集中管理查看,极大的为微服务开发人员提供了排查生产环境的便利 。如果规模较小的日志量,直接使用ElasticSearch、Logstash、Kibana是可以满足其应用的,但是对于日志量较大的中大规模服务集群来说,这3个中间会引入Filebeat、Kafka、Zookpeer三个中间来大幅度提升采集性能、可靠性、可扩展性 。目前来说,大部分公司使用的解决方案架构如下图:

微服务系列之分布式日志 ELK

文章插图
此篇文章,我们一起来熟悉整个流程的搭建,为了方便演示,环境基于docker(正常情况下,因为这套系统是直接linux部署的,因为开销实在是很大) 。
2.API服务
先建一个api服务,使用过滤器,让请求前后都会产生日志
微服务系列之分布式日志 ELK

文章插图
我这里,将日志写到根目录下logs文件夹,以MyDockerApi *.log产生日志文件,接下来,发布,并上传到linux服务器,并用docker启动,不会的同学传送门:https://www.cnblogs.com/saltlight-wangchao/p/16646005.html 。
微服务系列之分布式日志 ELK

文章插图
由于docker的隔离性,想要采集日志,必须给服务docker挂载到linux宿主机的盘内,上图就是我为该API服务创建的日志写入目录,因为可能一个宿主机上可能有多个API服务,所以,可以按照规则,继续新建服务文件夹,用于存放不同API服务的日志,我这里就弄了一个先 。
docker run --name API8082 -p 8081:5000 -v /etc/localtime:/etc/localtime--解决 docker 容器时间与本地时间不一致 -v /home/fileBeate/logs/mydockerapi1:/app/logs--挂载目录,降容器的app/logs目录挂载到宿主机,我们要指定该服务采集的目录 my1api 启动后,请求该服务
微服务系列之分布式日志 ELK

文章插图
至此,api服务所产生的日志,已经写到我们要采集的指定目录里 。
3.Filebeat
Filebeat是用于监视、采集、转发指定位置的文件轻量级开源工具,使用golang编写,就采集来说,其性能和资源利用率远好于基于jvm的logstash 。
在这里,filebeat做为kafka的生产者
1)拉取filebeat镜像
docker pull docker.elastic.co/beats/filebeat:6.4.22)创建filebeat.yml配置文件,进行vim修改
基础的配置
---filebeat.inputs:- type:logenabled: truefields:log_topics: mydockerapi1--命名以服务名字,注意,因为一台宿主机可能有多个服务,而我们采集也要分开,再来一组-typepaths:- /usr/share/filebeat/mydockerapi1-logs/*.log--这里是docker内的路径,千万别写错了 。如果是output.kafka:hosts:- "10.0.8.17:9092"--kafka的地址topic: "elk-%{[fields][log_topics]}"--消息队列的topic3)运行
【微服务系列之分布式日志 ELK】docker run --restart=always--name filebeat -d -v /home/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /home/fileBeate/logs/mydockerapi1/:/usr/share/filebeat/mydockerapi1-logsdocker.elastic.co/beats/filebeat:6.4.2进入filebeat容器内部如下图,可以看到已经采集到日志文件
微服务系列之分布式日志 ELK

文章插图
使用 docker logs -f filebeat 命令,查看filebeat日志
微服务系列之分布式日志 ELK

经验总结扩展阅读