环境:
Red Hat Enterprise Linux Server release 7.2
地址:
192.24.6.143
192.24.6.144
ELK:
Elasticsearch 7.1.1
Logstash 7.1.1
Kibana 7.1.1
FileBeat
FileBeat 7.1.0
IP | 软件/项目 | 备注 |
192.24.6.143:9200 | Elasticsearch | 软件 |
192.24.6.143:5044 | Logstash | 软件 |
192.24.6.143:5601 | Kibana | 软件 |
192.24.6.144 | FileBeat | 软件 |
192.24.6.144:8080 | Driver | 项目 |
192.24.6.144:8081 | Dispatcher | 项目 |
192.24.6.144:8082 | Prod | 项目 |
192.24.6.144:80 | SSO | 项目 |
我们的四个项目全部安装在/usr/local/bin下,每个项目都是以单独的Jar运行的,每个项目都有自己的日志文件,分别在自己的项目目录中的log目录下。
首先从官网下载安装包:https://www.elastic.co/cn/downloads/beats
官网首页默认都是最新版的,但是最新版一般会有BUG,因此,我们一般会选用低版本,这里,我们将网页向下拉,看到
然后选择选择版本后,便可以下载了,Linux对应的文件如下:
因为我们的项目全部部署在了192.24.6.144环境中,因此我们需要把FileBeat安装在144环境中,执行以下命令:
//解压安装包
tar -xvf filebeat-7.1.0-linux-x86_64.tar.gz
//将默认配置文件备份一份,以供后续恢复,由于filebeat默认读取的配置文件是filebeat.yml
cp filebeat.yml filebeat.yml.default
//配置文件
vim filebeat.yml
//保持其他内容不动,请更改以下信息
filebeat.inputs:
//filebeat数据源的类型,log
- type: log
enabled: true
//收集日志的地址
paths:
- /usr/local/bin/sso/log/system.log
//由于需要收集多个日志文件以便在Elasticsearch中生成索引,因此我们需要给不同的日志文件先打一个标记,以便在logstash中使用
tags: ["sso"]
//开启该配置,表示从日志文件的尾部开始获取日志,不必完全加载所有日志,以防数据太大
tail_files: true
- type: log
enabled: true
paths:
- /usr/local/bin/dispatcher/log/dispatcher.log
tags: ["dispatcher"]
tail_files: true
- type: log
enabled: true
paths:
- /usr/local/bin/driver/log/driver.log
tags: ["driver"]
tail_files: true
- type: log
enabled: true
paths:
- /usr/local/bin/prod/log/prod.log
tags: ["prod"]
tail_files: true
output.logstash:
hosts: ["192.24.6.143:5044"]
然后再项目根目录:
./filebeat
即可启动filebeat,但是filebeat是没有任何提示信息的,我们此时需要再用X-shell等辅助软件开启一个窗口,利用ps -ef | grep filebeat
可以看到:
root 10671 18225 2 09:50 pts/3 00:00:00 ./filebeat
root 10708 22183 0 09:50 pts/3 00:00:00 grep --color=auto filebeat
说明启动成功了。
3.2 ElasticSearch/Logstash/Kibana安装
同理首先从官网下载7.1.1版本的:https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/cn/products/logstash
这里我们需要注意的是,ELK套装是无法用root用户启动的,因此我们需要创建新的用户并赋予其权限:
以下内容先再root用户下完成:
groupadd elkpro
useradd -g elkpro elkpro
passwd elkpro
创建运行目录
mkdir /elkpro
chown -R elkpro:elkpro /elkpro
关闭防火墙:
iptables -F
然后切换到elkpro用户开始下面内容的搭建:
//切换用户身份
su elkpro
//建议体检将安装包放入到该目录下,现在我们进入到该目录下
cd /home/elkpro
//解压
tar -xvf elasticsearch-7.1.1-linux-x86_64.tar.gz
//重命名安装目录
mv elasticsearch-7.1.1 elasticsearch
//进入到该安装目录下
cd elasticsearch
//进入到配置文件目录下
cd ./config
vim elasticsearch.yml
//然后增加或更改下面几行内容
//在----------Node------------下修改
node.name: node-1
//在----------Paths-----------下修改
path:data: /elkpro/data/
path.logs: /elkpro/logs/
//在---------Memory-----------下增加
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
//在---------Discovery--------下增加
cluster.initial_master_nodes: ["node-1"]
//在---------NetWork----------下增加
network.host: 0.0.0.0
//在---------Various----------下增加
http.cors.enabled: true
http.cors.allow-origin: "*
然后在./elasticsearch目录下启动:
./bin/elasticsearch
然后我们可能会遇到以下几种错误,其实都是因为配置文件属性没有设置或者没有达到elastic search要求所致:
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
这个问题的解决如下:
//切换到root用户
su root
//这里要求输入root用户的密码
vim /etc/security/limits.conf
//增加下面两行内容
elkpro soft nofile 65536
elkpro hard nofile 65536
[2]、max number of threads [3818] for user [es] is too low, increase to at least [4096]
该问题的解决思路如下:
//切换到root用户
su root
vim /etc/security/limits.conf
//增加下面两行内容
elkpro soft nproc 4096
elkpro hard nproc 4096
[3]、max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
该问题的解决思路如下:
su root
vim /etc/sysctl.conf
//增加下面一行内容
vm.max_map_count=262144
//保存退出后,执行下面的命令
sysctl -p
[4]、Exception in thread "main" java.nio.file.AccessDeniedException: /home/elkpro/elasticsearch/elasticsearch-7.1.0-1/config/jvm.options
该问题的解决思路如下:
chown -R elkpro:elkpro /elkpro/
[5]、elasticsearch requries jdk 11, but....
这是保存安装的jdk环境为8,但是ELK需要11的JDK,因此,借助下面大佬的思路解决即可:
https://www.jianshu.com/p/6ddeae547f45
然后启动一下:
./bin/elasticsearch
通过浏览器测试是否成功:
我们访问安装的地址:192.24.6.143:9200
会看到:
{
"name": "node-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "eCi_JX7rQ36xXyX318xcng",
"version": {
"number": "7.1.1",
"build_flavor": "default",
"build_type": "tar",
"build_hash": "7a013de",
"build_date": "2019-05-23T14:04:00.0384842Z",
"build_snapshot": false,
"lucene_version": "8.0.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimun_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Konw, for Search"
}
相比elasticsearch的安装过程,logstash的安装就显得比较简单了,同样是需要切换到elkpro用户下进行的:
su elkpro
cd /home/elkpro
tar -xvf logstash-7.1.1.tar.gz
mv logstash-7.1.1 logstash
//然后进入到配置文件目录
cd ./config
//我们简单进行以下标准输入输出测试
vim test.conf
input {
stdin{}
}
output {
stdout{codec=>rubydebug}
}
然后在logstash安装目录下,执行下面命令:
./bin/logstash -f ./config/test.conf
启动成功后我们可以看到:
Successfully started Logstash API endpoint {port=>9600}
然后我们输入任意一句话,可以看到它都有反馈。
当然我们是要和FileBeat一起共同收集日志数据的因此我们配置如下:
-input {
beats {
port => 5044
}
}
filter {
mutate { //这里由于我们更多关注采集的日志,因此我们把一些没有必要的系统数据过滤掉
remove_field => "host"
remove_field => "agent"
}
//我们收集日志的目的是为了利用日志的等级作为字段属性来快速定位的
//因此我们引入grok正则匹配来提取字段
//由于我们这里的项目较多,其中sso的日志格式如下:
//2019-08-13 10:18:18.360 INFO 24681 ---[nio-88-exec-3] [] [192.24.6.144] i.z...
//我们只需要提取到INFO这个字段因此,从前往后只需要匹配到INFO即可
//其他项目的日志格式如下:
//910826487 2019-08-13 10:20:11.222 [nio-88-exec (Camel)] WARN dispatcher.....
//这里我们使用grok的正则匹配,其中时间戳已经有标准正则为TIMESTAMP_ISO8601,数字为NUMBER,日志级别为LOGLEVEL,那么剩下的我们来写
if "sso" in [tags] {
grok {
match => { //这里这样写,便会存在time和loglevel字段了
"message" => "^%{TIMESTAMP_ISO801:time}%{SPACE}%{SPACE}%{LOGLEVEL:loglevel}"
}
}
} else {
grok {
match => { //这里我们使用了3个grok自身带的3个标准正则匹配,同时用了一个自定义的正则(?Info\[.*\])
"message" => "^%{NUMBER:num}%{SPACE}%{TIMESTAMP_ISO8601:time}%{SPACE}(?Info\[.*\])%{SPACE}%{LOGLEVEL:loglevel}"
}
}
}
}
output {
if "sso" in [tags] {
elasticsearch {
hosts => ["192.24.6.143:9200"]
index => "sso_%{YYYY.MM.dd}"
}
}
if "dispatcher" in [tags] {
elasticsearch {
hosts => ["192.24.6.143:9200"]
index => "dispatcher_%{YYYY.MM.dd}"
}
}
if "driver" in [tags] {
elasticsearch {
hosts => ["192.24.6.143:9200"]
index => "driver_%{YYYY.MM.dd}"
}
}
if "prod" in [tags] {
elasticsearch {
hosts => ["192.24.6.143:9200"]
index => "prod_%{YYYY.MM.dd}"
}
}
}
启动即可。
PS:关于GROK正则表达可以参见:
https://blog.csdn.net/zhaoyangjian724/article/details/52368668
同样安装kibana是很容易的,切换到elkpro用户下:
su elkpro
tar -xvf kibana-7.1.1-linux-x86_64.tar.gz
mv kibana-7.1.1-linux-x86_64 kibana
cd ./kibana
cd ./config
//修改如下配置信息
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["http://192.24.6.143:9200"]
然后启动:
./bin/kibana
然后我们访问192.24.6.143:5601便可以访问到kibana页面了~
elastic search -> logstash -> filebeat -> kibana
日志的存在是为了我们快速定位到某个问题并解决问题的,因此很久之前的日志没有必要再次保存,因此我们这里使用LINUX中的Crontab进行定时任务来删除15天的索引。
我们在定义logstash向elasticsearch中输出索引的格式为XXX-2019.08.10,因此,我们可以先定义一个脚本:
touch es_clear.sh
vim es_clear.sh
//进入到编辑器中开始编辑内容
#! /bin/bash
DATA=`date -d "-15 days" "+%Y.%m.&d"`
curl -H "Content-Type:application/json" -XDELETE 'http://192.24.4.143:9200/*-'${DATA}''
然后wq保存即可
然后我们要将该脚本加入到定时任务中,此时由于文件权限可能不够,我们先提升文件权限:
chmod +x es_clear.sh
首先在界面敲入:crontab -e后回车,可以打开crontab的编辑界面
0 1 * * * /home/elkpro/scripts/es_clear.sh
wq保存即可。