公司面对日益增长的日志和集群主机,日志观察变得越发困难,部分实习生对Linux不熟练,查日志效率低,决定寻找一个图形化的日志查询工具,经过对比,ELK在部署复杂度,可拓展性等各个方面均超越其他方案,更符合我们公司对日志监控的需求

ELK

首先ELK是由Elasticsearch + LogStash + Kibana组成, 5.0起增加了FileBeat,拥有Beat的体系称为Elastic Stack
大名鼎鼎的Elasticsearch,使用apache顶级项目Lucene - 全文检索引擎工具包,进一步完善并简化使用,在这个体系中提供了分析,存储的功能。
LogStash是一个日志收集、过滤的框架。Kibana是一个图形化的展示框架。

最后FileBeat是新加入的成员,他的作用跟LogStash基本差不多,但FileBeat更加轻,对系统占用较低,所以现在的架构变成ELK + 一大堆FileBeat的节点,FileBeat把日志输送到LogStash中,由LogStash过滤整理,发送到ElesticSearch中,最终由Kibana做界面展示

搭建

注:博客中所提及的软件版本基于当前最新版本 - 6.5.7
先安装JDK,因为Oracle可能要收费,最好采用OpenJDK,避免日后麻烦
然后引入官方的镜像源:

1
2
3
4
5
6
7
8
9
10
11
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/elastic.repo

[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

然后就可以安装这四个软件了

1
2
3
4
yum install -y elasticsearch
yum install -y kibana
yum install -y logstash
yum install -y filebeat

当然是不建议ELK安装在同一台主机上,elasticsearch最好组成分布式,一个主节点,两个数据节点
kibana和logstash可以安装在同一台主机上,而filebeat安装在被监控的主机上

ES配置&启动

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
vim /etc/elasticsearch/elasticsearch.yml # es配置文件
systemctl start elasticsearch.service #启动
ps aux |grep elasticsearch #查询是否有进程
netstat -lntp |grep java #es会启动两个端口 9300端口是集群通信用的,9200则是数据传输时用的。
ls /var/log/elasticsearch/ #查看日志
#注意 此时如果log/下没有日志 可以使用tail -n50 /var/log/messages 查看系统日志

curl 'ip:9200/_cluster/health?pretty' #查询健康情况

# 结果大概是这样,status 为 green表示OK,没问题
{
"cluster_name" : "master-node",
"status" : "green", # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
"timed_out" : false, # 是否有超时
"number_of_nodes" : 2, # 集群中的节点数量
"number_of_data_nodes" : 1, # 集群中data节点的数量
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}

#查详细信息
curl 'ip:9200/_cluster/state?pretty'

logstash配置&启动

1
2
3
4
5
vim /etc/logstash/conf.d/syslog.conf # logstash配置文件
cd /usr/share/logstash/bin #进入logstash路径
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit #检查配置文件是否正确
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf #启动
netstat -lntp |grep 9210 #查询端口是否监听 此处为你配置监听的端口号

kibana配置&启动

1
2
3
4
5
vim /etc/kibana/kibana.yml # kibana配置文件
touch /var/log/kibana.log; chmod 777 /var/log/kibana.log
systemctl start kibana
ps aux |grep kibana #查询是否有进程
netstat -lntp |grep 9201 #查询端口是否监听 此处为你配置的端口号

启动成功后,浏览器访问http://ip:9201/,应该可以看到你的kibana洁面

filebeat配置&启动

1
2
3
4
5
6
7
vim /etc/filebeat/filebeat.yml  # filebeat配置文件
#首先我们设置一下输出到控制台,然后执行这条查看是否有输出,有输出表示正常
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml
systemctl start filebeat #正式启动前,需要把输出改为logstash的地址,建议不要直接输出到es中
ps axu |grep filebeat #查询是否有进程
netstat -lntp |grep 9202 #查询端口是否监听 此处为你配置的端口号
curl 'es_ip:9200/_cat/indices?v' #查看是否有索引

配置

其实配置这一块我觉得还是挺简单的

首先配置ES

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
# ---------------------------------- 集群 -----------------------------------
#
# 为集群设置一个描述名称:
cluster.name: master
# ------------------------------------ Node ------------------------------------
#
# 为节点设置一个名称:
node.name: master-node
# 是否为master节点
node.master: true
# Add custom attributes to the node:
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# 存储数据路径 (separate multiple locations by comma):
path.data: /var/lib/elasticsearch
#
# 日志文件路径:
path.logs: /var/log/elasticsearch
#
# ---------------------------------- Network -----------------------------------
#
# 设置绑定的IP 默认的0.0.0.0即可 (IPv4 or IPv6):
network.host: 0.0.0.0
#
#设置端口号:
http.port: 9200
#
# --------------------------------- Discovery ----------------------------------
# 如果是集群模式在这里配置
#
# discovery.zen.ping.unicast.hosts: ["49.4.15.184"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
# discovery.zen.minimum_master_nodes:
#

配置完成后,就可以启动ES了。

然后配置logstash,这个文件有点说道,他可以开好几个端口监听不同来源的日志,也可以通过一个端口来监听多个来源
重要的是打Tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
input {                                             # 定义日志源
beats {
port => 9203
}
syslog {
type => "system-syslog" # 定义类型
port => 9202 # 定义监听端口
}
}
output { # 定义日志输出
if "telecom-64-server-8080" in [tags]{ # 判断日志的标签
elasticsearch {
hosts => ["localhost:9200"] # 定义es服务器的ip
index => "telecom-64-server-8080-%{+YYYY.MM}" # 定义索引
}
}
elasticsearch {
hosts => ["localhost:9200"] # 定义es服务器的ip
index => "system-syslog-%{+YYYY.MM}" # 定义索引
}
}

启动完logstash后,先把kibana启动起来
就四行配置即可

1
2
3
4
server.port: 9201
server.host: "0.0.0.0"
logging.dest: /var/log/kibana.log
elasticsearch.url: "http://49.4.15.184:9200"

最后到需要被监听的服务的主机上,配置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
#=========================== Filebeat inputs =============================

filebeat.inputs:
- type: log
# 是否启用这个配置
enabled: true
# 配置一个数据源
paths:
- /home/webapp/tomcat-8.0.36_telecom_8080/logs/catalina.out
# 配置这个数据源的标签
tags: ["telecom-64-server-8080"]
#============================= Filebeat modules ===============================

filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 3
#============================== Kibana =====================================
setup.kibana:

#----------------------------- Logstash output --------------------------------
output.logstash:
hosts: ["49.4.15.184:9203"]
#================================ Procesors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~

总结

这样就配置好了Elastic Stack,下一篇来弄一下警告系统的集成