一、ELK日志业务流程
说明:
- 通过Beats采集Nginx的指标数据和日志数据
- Beats采集到数据后发送到Elasticsearch中
- Kibana读取数据进行分析
- 用户通过Kibana进行查看分析报表
二、安装nginx
省略
三、安装filebeat
3.1、什么是filebeat?
### Filebeat工作原理
Filebeat主要由下面几个组件组成: harvester、prospector 、input
#### harvester
- 负责读取单个文件的内容
- harvester逐行读取每个文件(一行一行读取),并把这些内容发送到输出
- 每个文件启动一个harvester,并且harvester负责打开和关闭这些文件,这就意味着harvester运行时文件描述符保持着打开的状态。
- 在harvester正在读取文件内容的时候,文件被删除或者重命名了,那么Filebeat就会续读这个文件,这就会造成一个问题,就是只要负责这个文件的harvester没用关闭,那么磁盘空间就不会被释放,默认情况下,Filebeat保存问价你打开直到close_inactive到达
#### prospector
- prospector(探测器)负责管理harvester(收集器)并找到所有要读取的文件来源
- 如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester
- Filebeat目前支持两种prospector类型:log和stdin
- Filebeat如何保持文件的状态
- Filebeat保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中
- 该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。
- 如果输出(例如ElasticSearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可以用时继续读取文件。
- 在Filebeat运行时,每个prospector内存中也会保存的文件状态信息,当重新启动Filebat时,将使用注册文件的数量来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取
- 文件状态记录在data/registry文件中
### input
- 一个input负责管理harvester,并找到所有要读取的源
- 如果input类型是log,则input查找驱动器上与已定义的glob路径匹配的所有文件,并为每个文件启动一个harvester
- 每个input都在自己的Go例程中运行
- 下面的例子配置Filebeat从所有匹配指定的glob模式的文件中读取行
```yml
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
- /var/path2/*.log
```
### 启动命令
```bash
./filebeat -e -c mogublog-es.yml
./filebeat -e -c mogublog-es.yml -d "publish"
```
### 参数说明
- **-e:**输出到标准输出,默认输出到syslog和logs下
- **-c:**指定配置文件
- **-d:**输出debug信息
3.2、下载
官网地址:https://www.elastic.co/cn/downloads/beats/filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz
3.3、安装
[root@node1 app]# tar -zxvf filebeat-6.5.4-linux-x86_64.tar.gz && mv filebeat-6.5.4-linux-x86_64 filebeat && cd filebeat
3.4、启动
# 创建配置文件、添加如下内容
[root@node1 filebeat]# vim test1.yml
filebeat.inputs: # filebeat input输入
- type: stdin # 标准输入
enabled: true # 启用标准输入
setup.template.settings:
index.number_of_shards: 3 # 指定下载数
output.console: # 控制台输出
pretty: true # 启用美化功能
enable: true
# 启动
[root@node1 filebeat]# ./filebeat -e -c test1.yml
3.5、读取文件启动
再次创建一个文件名字为test2.yml,写入以下文件
[root@node1 filebeat]# cat test2.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /app/test/logs/*.log
setup.template.settings:
index.number_of_shards: 3
output.console:
pretty: true
enable: true
添加完成后,我们在到下面目录创建一个日志文件
[root@node1 filebeat]# mkdir -p /app/test/logs
[root@node1 filebeat]# cd /app/test/logs/
# 追加内容
[root@node1 logs]# echo "hello" >> a.log
启动filebeat
[root@node1 filebeat]# ./filebeat -e -c test2.yml
3.6、自定义字段启动
当元数据没办法支撑我们的业务时,我们还可以自定义添加一些字段
再次创建一个文件名字为test3.yml,写入以下文件
filebeat.inputs:
- type: log
enabled: true
paths:
- /app/test/logs/*.log
tags: ["web", "test"] #添加自定义tag,便于后续的处理
fields: #添加自定义字段
from: test-web
fields_under_root: true #true为添加到根节点,false为添加到子节点中
setup.template.settings:
index.number_of_shards: 3
output.console:
pretty: true
enable: true
启动
[root@node1 filebeat]# ./filebeat -e -c test3.yml
再次写入数据查看结果
# 写入数据
[root@node1 logs]# echo "aaax" > axxx.log
2020-12-05T21:48:40.398+0800 INFO log/harvester.go:254 Harvester started for file: /app/test/logs/axxx.log
{
"@timestamp": "2020-12-05T13:48:40.398Z",
"@metadata": {
"beat": "filebeat",
"type": "doc",
"version": "6.5.4"
},
"host": {
"name": "node1"
},
"beat": {
"name": "node1",
"hostname": "node1",
"version": "6.5.4"
},
"source": "/app/test/logs/axxx.log",
"offset": 0,
"message": "aaax", # 可以看到刚刚自定义的标签
"tags": [
"web",
"test"
],
"from": "test-web", # 可以看到刚刚自定义的字段(且在子节点)
"prospector": {
"type": "log"
},
"input": {
"type": "log"
}
}
四、输出到ElasticSearch
我们可以通过配置,将修改成如下所示
[root@node1 filebeat]# cat test3.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /app/test/logs/*.log
tags: ["web", "test"] #添加自定义tag,便于后续的处理
fields: #添加自定义字段
from: test-web
fields_under_root: true #true为添加到根节点,false为添加到子节点中
setup.template.settings:
index.number_of_shards: 3
#output.console:
# pretty: true
# enable: true
# 上面的注释,改成以下2行
output.elasticsearch:
hosts: ["192.168.1.111","192.168.1.112","192.168.1.113"]
再次启动
[root@node1 filebeat]# ./filebeat -e -c test3.yml
写入数据
[root@node1 logs]# echo "1213" > aa.log
查看结果,说明已经成功连接到了elasticsearch集群中
2020-12-05T22:05:43.376+0800 INFO log/harvester.go:254 Harvester started for file: /app/test/logs/aa.log
2020-12-05T22:05:44.380+0800 INFO pipeline/output.go:95 Connecting to backoff(elasticsearch(http://192.168.1.113:9200))
2020-12-05T22:05:44.380+0800 INFO pipeline/output.go:95 Connecting to backoff(elasticsearch(http://192.168.1.111:9200))
2020-12-05T22:05:44.381+0800 INFO pipeline/output.go:95 Connecting to backoff(elasticsearch(http://192.168.1.112:9200))
页面查看, 0 1 2 三个分片
五、读取nginx配置文件
修改配置文件如下
[root@node1 filebeat]# cp test3.yml red_nginx.yml
[root@node1 filebeat]# cat red_nginx.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /app/nginx/logs/*.log
tags: ["nginx"] #添加自定义tag,便于后续的处理
setup.template.settings:
index.number_of_shards: 3
output.elasticsearch:
hosts: ["192.168.1.111","192.168.1.112","192.168.1.113"]
启动
[root@node1 filebeat]# ./filebeat -e -c red_nginx.yml
六、结合Module收集日志
6.1、Module介绍
前面要想实现日志数据的读取以及处理都是自己手动配置的,其实,在Filebeat中,有大量的Module,可以简化我们的配置,直接就可以使用,如下:
[root@node1 filebeat]# ./filebeat modules list
Enabled:
Disabled:
apache2
auditd
elasticsearch
haproxy
icinga
iis
kafka
kibana
logstash
mongodb
mysql
nginx
osquery
postgresql
redis
suricata
system
traefik
以看到,内置了很多的module,但是都没有启用,如果需要启用需要进行enable操作:
#启动
./filebeat modules enable nginx
#禁用
./filebeat modules disable nginx
可以发现,nginx的module已经被启用。
[root@node1 filebeat]# ./filebeat modules list
Enabled:
nginx
6.2、nginx module 配置
我们到下面的目录,就能看到module的配置了
# 进入到module目录
[root@node1 filebeat]# cd modules.d/
#查看文件
[root@node1 modules.d]# vim nginx.yml
修改后得到的文件内容如下所示
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-nginx.html
- module: nginx
# Access logs
access:
enabled: true
# 添加日志文件
var.paths: ["/app/nginx/logs/access.log*"]
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Error logs
error:
enabled: true
var.paths: ["/app/nginx/logs/error.log*"]
修改filebeat配置文件
[root@node1 filebeat]# cat red_nginx.yml
setup.template.settings:
index.number_of_shards: 3
output.elasticsearch:
hosts: ["192.168.1.111","192.168.1.112","192.168.1.113"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
又一次启动!
[root@node1 filebeat]# ./filebeat -e -c red_nginx.yml
报错了,意思是要在ES节点上安装这2个包(好像7版本不会报错!!!)
sudo bin/elasticsearch-plugin install ingest-user-agent
sudo bin/elasticsearch-plugin install ingest-geoip
安装,这样安装有点慢,可以自行到网上下载安装包解压
# 切换到elsearch用户
# 进入/app/elasticsearch
# 执行,网速不是很慢的朋友都下挺快的
[elsearch@master elasticsearch]$ bin/elasticsearch-plugin install ingest-user-agent
[elsearch@master elasticsearch]$ bin/elasticsearch-plugin install ingest-geoip
# 然后重启集群
[elsearch@slave1 elasticsearch]$ jps |grep Elasticsearch |awk '{print $1}'|xargs kill -9
[elsearch@slave1 elasticsearch]$ /app/elasticsearch/bin/elasticsearch -d
然后再次启动,就不报错了
[root@node1 filebeat]# ./filebeat -e -c red_nginx.yml
页面查看日志也正常
{
"_index": "filebeat-6.5.4-2020.12.06",
"_type": "doc",
"_id": "6lYMNHYBOXECivMsy6S_",
"_version": 1,
"_score": 1,
"_source": {
"offset": 7542,
"nginx": {
"access": {
"referrer": "-",
"response_code": "200",
"remote_ip": "192.168.1.129",
"method": "GET",
"user_name": "-",
"http_version": "1.1",
"body_sent": {
"bytes": "10"
},
"remote_ip_list": [
"192.168.1.129"
],
"url": "/",
"user_agent": {
"patch": "0",
"original": "curl/7.29.0",
"major": "7",
"minor": "29",
"os": "Other",
"name": "curl",
"os_name": "Other",
"device": "Other"
}
}
},
"prospector": {
"type": "log"
},
"read_timestamp": "2020-12-05T17:56:59.585Z",
"source": "/app/nginx/logs/access.log",
"fileset": {
"module": "nginx",
"name": "access"
},
"input": {
"type": "log"
},
"@timestamp": "2020-12-05T17:56:53.000Z",
"beat": {
"hostname": "node1",
"name": "node1",
"version": "6.5.4"
},
"host": {
"name": "node1"
}
}
}