集群分布式下日志架构的搭建

问题

  • 1.生产环境中项目节点过多,如何集中管理日志?
  • 2.多节点项目中,出现问题如何定位到某个具体节点出现问题?进而迅速获取该节点日志?
  • 3.EFK是如何收集管理日志的?演示。
  • 4.搭建过程


日志基础架构

集群分布式下日志架构的搭建

解决

效果

  • 非容器日志查看效果

集群分布式下日志架构的搭建

  • 容器日志查看效果

集群分布式下日志架构的搭建

思路

  • 首先确定那种日志,容器或者非容器
  • 针对于非容器日志,直接采用filebeat采集固定目录日志即可,只不过在采集参数上可以有所调整,可以直接将业务日志改成JSON,也可以不改,但是要注意的是日志采集的时候异常日志的采集方式,filebeat默认是单行,但是单行的对于出现一堆异常的日志来说,查看不是很方便明确,因此注意采取多行采集配置,如上图演示效果中的日志.
  • 日志的唯一链路ID的充分使用,在java项目中,直接可以通过slf4j的MDC格式化到日志中即可,后续定位的关键。kibana中的检索条件可以充分配合,如上述效果图中的黄色部分。
  • 针对于容器日志,则使用fluentd,通过fluentd可以直接在一个filebeat中采集集群中所有容器的日志,最终由filebeat输出到es中,当然在容器启动的时候需要添加所在节点的IP标签和容器名称。

环境搭建实战

es7容器启动

docker pull elasticsearch:7.10.1 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name es7 elasticsearch:7.10.1  

kibana

配置文件

mkdir -p /data/efk/ cd /data/efk vi kibana.yml 

配置如下

server.namekibana server.host: "0.0.0.0" elasticsearch.hosts"http://192.168.99.x:9200" ] ## es地址 xpack.monitoring.ui.container.elasticsearch.enabledtrue i18n.locale: "zh-CN" 

启动

docker pull kibana:7.4.1 docker run -d  --name kibana -p 5601:5601 -v /data/efk/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.4.1 

es索引管理端

docker pull containerize/elastichd docker run -p 9800:9800 -d --name es-dashboard-ui containerize/elastichd 
  • fluentd 容器采集服务(将所有容器的日志采集到目标文件夹,再通过filebeat输出到es集群)
docker run -d --restart=always -p 24224:24224 -p 24224:24224/udp -v /data/fluentd/log:/fluentd/log fluent/fluentd 

filebeat下载配置

官网地址:
https://www.elastic.co/cn/downloads/beats/filebeat

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.11.1-linux-x86_64.tar.gz cd filebeat-7.11.1-linux-x86_64 vi filebeat.yml 

修改下面几个地方

# ================ Filebeat inputs======================= enabled: true   paths:     - /data/fluentd/log/*.log # 这个位置就是fluentd采集容器日志后输出的文件夹。  #多行采集配置 multiline.pattern: ^\[ multiline.negate: true multiline.match: after # ========== Kibana =================================== https://[2001:db8::1]:5601   host: "192.168.99.x:5601" # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch:   # Array of hosts to connect to.   hosts: ["192.168.99.xx:9200"] 

filebeat后台进程启动

nohup ./filebeat -e -c filebeat.yml > /dev/null 2>&1& 

容器日志采集输出

容器日志改为fluentd,默认为json-file. fluentd-address就是上面启动fluentd的服务IP:24224,

docker run -d \     --log-driver=fluentd \     --log-opt fluentd-address=192.168.1.x:24224 \     --log-opt tag="log-test-container-A" \     busybox sh -c 'while true; do echo " log message from container A"; sleep 10; done;'  

非容器日志采集输出

java项目的jar包为例,日志文件夹为/data/fluentd/log,即filebeat采集目录。

nohup java -jar demo-efk.jar > /data/fluentd/log/demo-efk.log 2>&1& 

最终效果

  • 访问 http://192.168.1.xx:5601/
  • 设置-> 索引模式 -> 创建索引模式 ,创建filebeat的索引模式
  • 左边栏,点击discover,即可查看日志效果。

#程序员##日志##分布式#

#容器#

#ElasticSearch#

您可能还会对下面的文章感兴趣: