### 问题
- 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下载配置
> 官网地址: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`,即可查看日志效果。
EFK日志采集架构