vlambda博客
学习文章列表

记录一下Elasticsearch+Filebeat+Kibana搭建过程(单节点)

背景

作为一个内容类应用,看新闻读资讯一直是头条用户的核心需求,页面的打开速度直接关系到用户使用头条的核心

传统查看日志的形式都是通过连接服务器查看服务器日志完成,这种方式会有以下弊端:

  1. 效率太慢,需要不停的连接服务器

  2. 日志文件本身对条件筛选并不友好

  3. 需要查看日志的人员对linux系统有些许熟悉

  4. 如果涉及分布式服务系统,需要同时查看多个服务的日志才能找到对应一条请求的整体日志

  5. 日志无法做整体的统计


日志收集系统介绍(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