问题
- 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下载配置
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
,即可查看日志效果。