记录一下Elasticsearch+Filebeat+Kibana搭建过程(单节点)
背景
作为一个内容类应用,看新闻读资讯一直是头条用户的核心需求,页面的打开速度直接关系到用户使用头条的核心
传统查看日志的形式都是通过连接服务器查看服务器日志完成,这种方式会有以下弊端:
效率太慢,需要不停的连接服务器
日志文件本身对条件筛选并不友好
需要查看日志的人员对linux系统有些许熟悉
如果涉及分布式服务系统,需要同时查看多个服务的日志才能找到对应一条请求的整体日志
日志无法做整体的统计
日志收集系统介绍(Elasticsearch+Filebeat+Kibana)
ElasticSearch(https://www.elastic.co/cn/elasticsearch/) 是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Filebeat(https://www.elastic.co/cn/beats/) 是一个完全开源的工具,属于Beats中的一种,具体介绍可以从官网中查看,它可以对你的日志进行收集、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索),server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去,Filebeat对比Logstash更为轻量,但是如果要实现过滤等功能需要用到ES中pipeline技术。
Kibana(https://www.elastic.co/cn/kibana) 是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Filebeat 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
单节点EFK搭建
使用版本:Elasticsearch6.3.2,Filebeat6.3.2,Kibana6.3.2
因为官网下载速度太慢,可以使用以下链接下载:
Elasticsearch6.3.2: https://pan.baidu.com/s/1i-dbRzQshpro8RQqM9cqeQ 提取码:1234
Filebeat6.3.2: https://pan.baidu.com/s/1xiQtZe6IVtaPBnjcJTALnA 提取码:1234
Kibana6.3.2: https://pan.baidu.com/s/1JC8WeMqLsxtIELI4wx_MDw 提取码:1234
Elasticsearch
#将下载的文件上传到服务器
#解压文件
tar -zxvf elasticsearch-6.3.2.tar.gz -C /usr/local/elk/
#更改解压后文件夹名称
mv /usr/local/elk/elasticsearch-6.3.2 /usr/local/elk/es
1
2
3
4
5
6
es不能用root用户启动,因为es可以接收用户输入的脚本并且执行,为了系统安全考虑,需要重新创建用户。
useradd es_user
1
切换root用户将刚刚解压的es文件夹设置为所有人可读可写
su root
chmod -R 777 /usr/local/elk/es/
1
2
因为es对当前用户的内存和可打开的文件数有最小限制,我们需要修改普通用户的最大内存和最大可打开文件数,如果服务器本身没有这么多内存,可以修改es启动变量来减少使用的内存大小,具体操作自行查询
#内存修改
vi /etc/sysctl.conf
#添加以下配置:
vm.max_map_count=262144 #具体大小可以查看es最小内存配置
#执行以下命令生效
sysctl -p
1
2
3
4
5
6
#最大可打开的文件数
vi /etc/security/limits.conf
#添加以下配置
es_user soft nofile 65535
es_user hard nofile 65535
1
2
3
4
5
设置配置文件elasticsearch.yml,这里我只用了部分配置,具体配置详解:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/modules.html
vi /usr/local/elk/es/config/elasticsearch.yml
#配置内容
cluster.name: es
node.name: node-1
node.master: true
node.data: true
path.data: /usr/local/elk/es/data
path.logs: /usr/local/elk/es/logs
network.host: 0.0.0.0
http.port: 9200
1
2
3
4
5
6
7
8
9
10
启动es,并且查看
#切换用户
su es_user
cd /usr/local/elk/es/
#后台启动es,不输出日志
nohup bin/elasticsearch >/dev/null 2>&1 &
#后台启动es,输出日志es_nohup.log
nohup bin/elasticsearch >es_nohup.log 2>&1 &
1
2
3
4
5
6
7
验证启动是否成功
http://ip:9200/
1
停止es
netstat -tunlp | grep 9200
kill -9 PID
1
2
Kibana
#将下载的文件上传到服务器
#解压文件
tar -zxvf kibana.tar -C /usr/local/elk/
1
2
3
4
修改配置文件kibana.yml
vi /usr/local/elk/kibana/config/kibana.yml
#配置内容
server.port: 5601
server.host: "0.0.0.0"
#ip 是elasticsearch所在服务器的IP
elasticsearch.url: "http://ip:9200"
1
2
3
4
5
6
启动kibana
cd /usr/local/elk/kibana
#后台启动kibana,不输出日志
nohup config/kibana >/dev/null 2>&1 &
#后台启动kibana,输出日志 kibana_nohup.log
nohup config/kibana >kibana_nohup.log 2>&1 &
1
2
3
4
5
停止kibana
netstat -tunlp | grep 5601
kill -9 PID
1
2
Filebeat
#将下载的文件上传到服务器
#解压文件
tar xzvf filebeat-6.3.2-linux-x86_64.tar.gz -C /usr/local/elk/
#更改解压后文件夹名称
mv /usr/local/elk/filebeat-6.3.2-linux-x86_64 /usr/local/elk/filebeat
1
2
3
4
5
6
修改配置文件filebeat.yml,可以配置多个配置文件,在启动时选择,filebeat配置详细: https://www.elastic.co/guide/en/beats/filebeat/6.3/filebeat-configuration.html
filebeat.inputs:
- type: log
#启用
enabled: true
#扫描路径
paths:
- /home/levi/project_1/logs/log_error.log
- /home/levi/project_1/logs/log_warn.log
- /home/levi/project_1/logs/log_info.log
include_lines: ['INFO', 'WARN', 'ERROR']
#忽略12个小时之前更新的文件
ignore_older: 12h
#自定义字段
fields:
log_source: project_1
#多行日志配置
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
#每隔 scan_frequency 时间读取一次文件内容。对于关闭的文件,如果后续有更新,则经过 scan_frequency 时间后,Filebeat 将重新打开该文件,读取新增加的内容
scan_frequency: 10s
#生命周期持续时间
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_2/logs/log_error.log
- /home/levi/project_2/logs/log_warn.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_2
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_3/logs/*.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_3
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_4/logs/*.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_4
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
#==================== Elasticsearch template setting ==========================
setup.template.settings:
#索引分片数量配置
index.number_of_shards: 5
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
#es 对应服务器ip
hosts: ["ip:9200"]
#自定义索引名称
index: "levi-%{[fields.log_source]}"
#es中实现的过滤pipeline绑定
pipeline: "levi-elk-pipeline"
setup:
#es的filebeat模板,用来设置在Elasticsearch中的映射,如果模板加载是启用的(默认的),Filebeat在成功连接到Elasticsearch后自动加载索引模板
template:
enabled: true
name: "levi"
pattern: "levi-*"
overwrite: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
启动filebeat之前需要初始化es中的pipeline ,pipeline详解: https://www.elastic.co/guide/en/elasticsearch/reference/6.3/pipeline.html
PUT _ingest/pipeline/levi-elk-pipeline
{
"description": "levi elk pipeline",
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"""(?<timestamp>(?:%{YEAR}-%{MONTHNUM}-%{MONTHDAY})%{SPACE}(?:%{HOUR}:%{MINUTE}:%{SECOND}.\d{3}))(?<thread>(?:%{SPACE}\[.*?\]%{SPACE}))%{LOGLEVEL:level}(?<class>(?:%{SPACE}(\w+(\.)+)+\w*%{SPACE}))"""
]
}
},
{
"gsub": {
"field": "thread",
"pattern": """\s\[""",
"replacement": ""
}
},
{
"gsub": {
"field": "thread",
"pattern": """\]\s""",
"replacement": ""
}
},
{
"gsub": {
"field": "class",
"pattern": "\\s",
"replacement": ""
}
},
{
"date": {
"field": "timestamp",
"formats": [
"yyyy-MM-dd HH:mm:ss.SSS"
],
"timezone": "Asia/Shanghai"
},
"remove": {
"field": "timestamp"
}
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
启动filebeat
cd /usr/local/elk/filebeat
#后台启动filebeat 且不输出启动日志
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
#后台启动filebeat 输出启动日志 filebeat_nohup.log
nohup ./filebeat -e -c filebeat.yml >filebeat_nohup.log 2>&1 &
1
2
3
4
5
停止filebeat
ps -ef|grep filebeat
kill -9 PID