分布式下日志架构的搭建

问题

  • 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.name: kibana
server.host: "0.0.0.0"
elasticsearch.hosts: [ "http://192.168.99.x:9200" ] ## es地址
xpack.monitoring.ui.container.elasticsearch.enabled: true
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下载配置

官网地址:Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic

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,即可查看日志效果。

原文: https://mp.weixin.qq.com/s/pg14Rvtew8HYOeRVu2gp4g

2 Likes