总字符数: 10.17K

代码: 5.83K, 文本: 1.05K

预计阅读时间: 30 分钟

系统选型

Elastic 公司有一套免费开源的日志采集系统(ELK),所以我选择拿来即用. 日志流: 日志文件FileBeatLogstashElasticSearchKibana

Filebeat

Filebeat是一款轻量级日志采集器,可用于转发和汇总日志与文件.Filebeat内置有多种模块(Nginx、MySQL、Redis、Elasticsearch、Logstash等),可针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可.

Logstash

Logstash是一个分布式日志收集框架,开发语言是JRuby,经常与ElasticSearch,Kibana配合使用组成著名的ELK技术栈,所谓ELK就是ElasticSearch、Logstash、Kibana这三个组件.

ElasticSearch

Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.

Kibana

Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化.您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成.

系统准备

系统设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 关闭防火墙(如果因为其他原因不能关闭防火墙,也请不要禁止80和9200端口):
systemctl stop firewalld.service
# 禁止防火墙自动启动:
systemctl disable firewalld.service
# 修改操作系统参数
vi /etc/sysctl.conf
vm.max_map_count=262144

# 加载sysctl配置,执行命令:
sysctl -p

vim /etc/security/limits.conf
# 在文件最后加入
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

jdk安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 进入opt目录
cd /opt
# 下载JDK,推荐11系列
wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/11.0.8%2B10/openlogic-openjdk-11.0.8%2B10-linux-x64.tar.gz
# 解压
tar -zxvf openlogic-openjdk-11.0.8+10-linux-x64.tar.gz
# 修改文件夹名
mv openlogic-openjdk-11.0.8+10-linux-x64/ jdk/
# 定义环境变量
sed -i.ori '$a export ES_JAVA_HOME=/opt/jdk\nexport PATH=$ES_JAVA_HOME/bin:$ES_JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$ES_JAVA_HOME/lib:$ES_JAVA_HOME/jre/lib:$ES_JAVA_HOME/lib/tools.jar' /etc/profile
# 加载环境变量配置信息
source /etc/profile
# 确认检查jdk版本信息
java -version

openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment OpenLogic-OpenJDK (build 11.0.8+0-adhoc.centos.jdk11u)
OpenJDK 64-Bit Server VM OpenLogic-OpenJDK (build 11.0.8+0-adhoc.centos.jdk11u, mixed mode)

Elasticsearch部署

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
# 进入opt目录
cd /opt
# 把tar包下载到opt目录下
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.1-linux-x86_64.tar.gz
# 解压tar包
tar -zxvf elasticsearch-7.14.1-linux-x86_64.tar.gz
# 拷贝文件目录到/usr/local
cp -r elasticsearch-7.14.1/ /usr/local/elasticsearch
# 建立软连接
ln -s /usr/local/elasticsearch/ elasticsearch
# 修改配置文件
vim /usr/local/elasticsearch/config/elasticsearch.yml

# 以下取消注释
# 集群名称,单机版使用默认即可
cluster.name: my-application
# 节点名称,单机版使用默认即可
node.name: node-1
# 数据存放的路径
path.data: /usr/local/elasticsearch/data/
# 应用日志存放的路径
path.logs: /usr/local/elasticsearch/logs/
# 服务绑定的IP地址
network.host: 0.0.0.0
# 服务监听的端口
http.port: 9200
#初始主节点
cluster.initial_master_nodes: ["node-1"]

# 跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"

es不能以root用户身份运行,所以要创建新的用户组和用户名称

1
2
3
4
5
6
7
# 创建用户组
groupadd elsearch
# 创建用户
useradd elsearch -g elsearch -p elasticsearch

# 把es要用到的路径都设置成的文件组权限设置成新的用户组和用户
chown -R elsearch:elsearch /usr/local/elasticsearch

启动es  

1
2
3
4
# 切换到es用户
su elsearch
# 以后台服务运行
/usr/local/elasticsearch/bin/elasticsearch -d

查看启动日志可执行命令tail -f /usr/local/elasticsearch/logs/my-application.log  

通过ss -lntup查看端口号已经启动

执行curl命令检查服务是否正常响应:curl 127.0.0.1:9200,收到响应如下:

至此,ElasticSerach服务启动成功

Kibana部署

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
# 进入opt目录
cd /opt
# 把tar包下载到opt目录下
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.14.1-linux-x86_64.tar.gz
# 解压
tar -zxvf kibana-7.14.1-linux-x86_64.tar.gz
# 拷贝文件目录到/usr/local
cp -r kibana-7.14.1-linux-x86_64 /usr/local/kibana
# 建立软连接
ln -s /usr/local/kibana/ kibana
#打开Kibana的配置文件
vim /usr/local/kibana/config/kibana.yml

# 服务端口
server.port: 80
# 服务器主机IP地址
server.host: "主机的IP地址"
# es索引服务器地址与上一步配置es时的地址相同
elasticsearch.hosts: ["http://xxx.xxx.xxx.xxx:9200"]
i18n.locale: "zh-CN"

# 按esc输入以下内容保存并退出
:wq
# 这样其他电脑就能用浏览器访问Kibana服务了

# 不能以root用户运行
# 把es要用到的路径都设置成的文件组权限设置成新的用户组和用户
chown -R elsearch:elsearch /usr/local/kibana

# 切换到es用户
su elsearch
# 先前台运行看有没有报错
/usr/local/kibana/bin/kibana

# # 让服务在后台运行
nohup /usr/local/kibana/bin/kibana &

查看启动日志:tail -f /home/elsearch/nohup.out 以下信息表示启动成功:  

在浏览器访问http://主机IP:80;看到如下页面

小技巧

linux对于非root权限用户不能使用1024以下的端口,为了能够绑定端口 80 或 443,我们需要为 kibana 的二进制文件设置一些新功能.这可以以 root 用户身份使用以下命令完成:

1
2
3
4
setcap cap_net_bind_service=+epi /usr/local/kibana/bin/kibana
setcap cap_net_bind_service=+epi /usr/local/kibana/bin/kibana-plugin
setcap cap_net_bind_service=+epi /usr/local/kibana/bin/kibana-keystore
setcap cap_net_bind_service=+epi /usr/local/kibana/node/bin/node

现在就可以了

Filebeat部署(日志机)

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
# 进入opt目录
cd /opt
# 把tar包下载到opt目录下
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.1-linux-x86_64.tar.gz
tar -zxvf filebeat-7.14.1-linux-x86_64.tar.gz
mkdir /usr/local/elk
cp -r filebeat-7.14.1-linux-x86_64 /usr/local/elk/filebeat

# 修改配置文件
vim /usr/local/elk/filebeat/filebeat.yml

# 配置输入插件,注意是yml格式
filebeat.inputs:
# 数据来源是log日志文件
- type: log
enabled: true
# 日志文件路径
paths:
- /usr/local/nginx/nginx/logs/access*.log

# 解释内容格式为json的日志
# json.keys_under_root: true
# json.add_error_key: true
# json.message_key: log
# json.overwrite_keys: true
# 额外的标识字段,可以于区分是来自于哪个应用
fields:
log_type: logbackjson

# 配置多个log数据源
# - type: log

# Change to true to enable this input configuration.
# enabled: true

# Paths that should be crawled and fetched. Glob based paths.
# paths:
# - /var/log/xhg/gateway/*.log
#
# json.keys_under_root: true
# json.add_error_key: true
# json.message_key: log
# json.overwrite_keys: true

# fields:
# log_type: gateway

# 当输出插件中要使用自定义索引名称的时候配置这个
# setup.template.name: "cobee"
# setup.template.pattern: "cobee-*"
# 关闭ES配置
# 配置数据输出目标地
# output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["172.18.219.11:9200"]
# index: "xhg-ms-%{+yyyy.MM.dd}"
# 其它配置项保持默认即可

output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]

# 按esc输入以下内容保存并退出
:wq

# 后台运行filebeat,filebeat是一个轻量级的数据采集引擎,不需要安装jdk,不像logstash那么笨重

nohup /usr/local/elk/filebeat/filebeat -e -c /usr/local/elk/filebeat/filebeat.yml -d "Publish" & > nohup.out

#停止filebeat:
ps -ef grep filebeat
kill -9 pid

logstash部署(日志机)

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
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.14.1-linux-x86_64.tar.gz
tar -zxvf logstash-7.14.1-linux-x86_64.tar.gz
mkdir /usr/local/elk
cp -r logstash-7.14.1 /usr/local/elk/logstash
# 在目录/usr/local/elk/logstash下创建文件
vim /usr/local/elk/logstash/default.conf
# 内容如下:
# 监听5044端口作为输入
input {
beats {
port => "5044"
}
}
# 数据过滤
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
}
}
# 这是ElasticSerach服务的监听端口
output {
elasticsearch {
hosts => ["192.168.10.129:9200"]
index => "%{appname}-%{+YYYY.MM.dd}" #根据项目名称动态创建索引
}
}


# 启动logstash
nohup /usr/local/elk/logstash/bin/logstash -f /usr/local/elk/logstash/default.conf --config.reload.automatic &

# 如果报错运行
# 报错内容:Error: missing `server' JVM at `/usr/local/elk/logstash/jdk/lib/server/libjvm.so'.
# Please install or use the JRE or JDK that contains these missing components
cp /usr/local/elk/logstash/logstash-7.14.1/jdk/lib/server/libjvm.so /usr/local/elk/logstash/jdk/lib/server/

tail -f /usr/local/elk/logstash/logs/logstash-plain.log

Kibana配置

Chrome扩展程序下载ElasticSearch Head,查看ElasticSearch是否有数据

配置Kibana