ELK日志分析系统部署。
一、规划
分为以下2种
ELK:Logstash作为被控端采集日志存储至elasticsearch,然后kibana调用es数据来展示
ELK+F:在上面的基础上加一个轻量级的filebeat来作为采集被控端,然后输出日志到Logstash服务端,Logstash在日志存储至elasticsearch,然后kibana调用es数据来展示。
1、机器说明
主机名 | IP | 备注 | 版本 |
---|---|---|---|
elasticsearch-01 | 192.168.227.93 | 部署ElasticSearch主节点,环境java1.8 | 7.0.1 |
elasticsearch-02 | 192.168.227.91 | 部署ElasticSearch从节点,环境java1.8 | 7.0.1 |
kibana | 192.168.227.90 | 部署kibana分析日志(web页面),环境java1.8 | 7.0.1 |
Logstash | 192.168.227.88 | 采集日志,安装在存有日志的机器上或者安装一台作为服务端来接收filebeat发送的日志,再转发存储至es,环境java1.8 | 7.0.1 |
2、ELK环境准备
由于Elasticsearch、Logstash、Kibana均不能以root账号运行。 但是Linux对非root账号可并发操作的文件、线程都有限制。 所以,部署ELK相关的机器都要调整:
-
修改文件限制
# 修改系统文件
vi /etc/security/limits.conf
#增加的内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
-
调整进程数
#修改系统文件
vi /etc/security/limits.d/20-nproc.conf
#调整成以下配置
* soft nproc 4096
root soft nproc unlimited
-
调整虚拟内存&最大并发连接
#修改系统文件
vi /etc/sysctl.conf
#增加的内容
vm.max_map_count=655360
fs.file-max=655360
-
创建ELK专用用户
useradd elk
-
创建ELK相关目录并赋权
#创建ELK 数据目录
mkdir /data/elk/
#创建ELK APP目录
将解压后的压缩包mv至data/elk
#更改目录Owner
chown -R elk:elk /data/elk
3、ELK组件包下载地址
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.1-linux-x86_64.tar.gz
二、Elasticsearch 部署
本次一共要部署两个Elasticsearch节点,所有文中没有指定机器的操作都表示每个Elasticsearch机器都要执行该操作
1、准备工作
-
移动Elasticsearch到统一目录
root@elasticsearch-01:/data/elk# ls elasticsearch-7.0.1 root@elasticsearch-01:/data/elk#
-
切换账号
su - elk
-
数据&日志目录
创建Elasticsearch主目录
mkdir /data/elk/es
#创建Elasticsearch数据目录
mkdir /data/elk/es/data
#创建Elasticsearch日志目录
mkdir /data/elk/es/logs
2、Elasticsearch节点配置
-
修改配置
#打开目录
cd /data/elk/elasticsearch-7.0.1/
#修改配置
vi config/elasticsearch.yml -
主节点配置(192.168.227.93)
cluster.name: my-application
node.name: node-1
node.attr.rack: r1
path.data: /data/elk/es/data
path.logs: /data/elk/es/logs
bootstrap.memory_lock: true
network.host: 192.168.227.93
http.port: 9200
discovery.seed_hosts: ["192.168.227.93", "192.168.227.91"]
cluster.initial_master_nodes: ["node-1"]
action.destructive_requires_name: true
-
从节点配置(192.168.227.91)
cluster.name: my-application
node.name: node-2
node.attr.rack: r1
path.data: /data/elk/es/data
path.logs: /data/elk/es/logs
network.host: 192.168.227.91
http.port: 9200
discovery.seed_hosts: ["192.168.227.93", "192.168.227.91"]
action.destructive_requires_name: true
-
配置项说明
项 | 说明 |
---|---|
cluster.name |
集群名 |
node.name |
节点名 |
path.data | 数据保存目录 |
path.logs | 日志保存目录 |
network.host | 节点host/ip |
http.port | HTTP访问端口 |
transport.tcp.port | TCP传输端口 |
node.master | 是否允许作为主节点 |
node.data | 是否保存数据 |
discovery.zen.ping.unicast.hosts | 集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测 |
discovery.zen.minimum_master_nodes | 主节点个数 |
3、Elasticsearch启动&健康检查
-
启动
#进入elasticsearch根目录
cd /data/elk/elasticsearch-7.0.1/
#启动
./bin/elasticsearch &
三、Kibana部署
下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.0.1-linux-x86_64.tar.gz
1、机器准备
初始化环境,建立用户和安装路径
hostnamectl set-hotname kibana
useradd elk
mkdir /usr/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.0.1-linux-x86_64.tar.gz
tar -xf kibana-7.0.1-linux-x86_64.tar.gz -C usr/elk/ ##解压包至elk目录
chown -R elk:elk /usr/elk
2、修改kibana配置文件
elk@kibana:/usr/elk$ cat /usr/elk/kibana-7.0.1/config/kibana.yml| grep -Ev '^$|#'
i18n.locale: "zh-CN" ###设置为中文
server.port: 5601 ##监听端口
server.host: "192.168.227.90"
elasticsearch.hosts: "http://192.168.227.93:9200" ##es主机
3、启动kibana
su elk
./usr/elk/kibana-7.0.1/bin/kibana & 启动kibana后台运行
已经启动
四、Logstash对接es
1、机器准备
注意:这里是在需要对接日志的机器安装,此处不安装在192.168.227.88机器上,这台机器给第八步骤使用!
在需要对接日志的机器上安装logstash,然后对接elasticsearch主机。
logstash下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.tar.gz
以下是脚本,快速创建修改目录以及安装logstash
appdeploy@CDT-SIT-APP-03:~$ cat logstash_install.sh
#!/bin/bash
#创建elk用户
useradd elk
#创建相关目录
mkdir /usr/elk
mkdir -p /data/elk/logstash/data
mkdir -p /data/elk/logstash/logs
#安装logstash
tar -xf logstash-7.0.1.tar.gz
mv logstash-7.0.1 /usr/elk/logstash-7.0.1
echo "path.data: /data/elk/logstash/data" >> /usr/elk/logstash-7.0.1/config/logstash.yml
echo "path.data: /data/elk/logstash/logs" >> /usr/elk/logstash-7.0.1/config/logstash.yml
chown -R elk:elk /data/elk
chown -R elk:elk /usr/elk
2、建立conf文件
首先,logstash agent按配置好的规则从每台服务器上收集log,收集好后发送给elasticsearch,elasticsearch再创建索引并存储,最后再通过kibana结合es从web界面进行查询和展示。
了解流程后,需要了解logstash是怎么从日志里收集数据的。这里,就需要建立conf文件了。如下:
root@CDT-SIT-APP-03:/usr/elk/logstash-7.0.1/config# cat input-output.conf
input {
file{
path => ["/data/logs/cec-evcs-data-service-9267.log"]
start_position => beginning
codec=>plain
discover_interval=>30
}
}
output {
stdout { codec => plain }
elasticsearch {
hosts => "192.168.227.93:9200"
index => "cec_evcs_data_service_9267-%{+YYYY.MM.dd}"
## 日志背后以年月日结尾作为日志切割,方便后期的日志清理。
}
}
3、执行启动Logstash
su elk
/usr/elk/logstash-7.0.1/bin/logstash -f /usr/elk/logstash-7.0.1/config/input-output.conf --config.reload.automatic >/dev/null &
五、kibana页面
1、查看节点信息
点击左侧列表:堆栈监测
选择节点:
以下为节点信息。
2、创建索引
点击左侧列表:管理
创建索引模式即可,如下图
索引模式为:cec_evcs_data_service_9267*
创建索引,以时间筛选字段。
3、查看日志分析
六、ELK定时删除日志
以下这个地址是主es的日志存储展示,自行更换ip哈。因为是主从结构,所以删除主es的即会同步删除从es的日志。
http://192.168.227.91:9200/_cat/indices?v
1、执行脚本删除
将以下脚本放至主es的/data/elk/clear_log_script目录下,
脚本说明:前提是日志以日期切片保存,然后筛选多少天前的日志出来保存至指定文本,for循环执行删除日志。删除主es的即可。
cat /data/elk/clear_log_script/clear_log.sh
#!/bin/bash
#删除ELK10天前的日志,自己看情况改。
DATE=`date -d "10 days ago" +%Y.%m.%d`
curl -s -XGET http://127.0.0.1:9200/_cat/indices?v| grep $DATE | awk -F '[ ]+' '{print $3}' >/data/elk/clear_log_script/elk.log
for elk in `cat /data/elk/clear_log_script/elk.log`
do
curl -XDELETE "http://192.168.227.93:9200/$elk"
done
加入到定时任务
# crontab -e
#每天凌晨1点定时清理elk索引`
00 01 * * * bash /data/elk/clear_log_script/clear_log.sh &>/dev/null
注意:保证crond服务是启动的
2、kibana页面删除es存储索引
这还要我写?自己页面点点就好了。
3、单台ES情况下没有分片,
3、kibana页面显示索引YELLOW
所有的日志会现实黄色警告,yellow,下面这个脚本是将其改为绿色,需要定期执行
root@CDT-UAT-LOG:/data/# cat /data/elk/green.sh
#!/bin/bash
curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/_settings' -d '
{
"index" : {
"number_of_replicas" : 0
}
}'
七、ELK在linux后台启动命令
1、filebeat启动
后台启动生成日志文件
进入file-..*目录下 nohup ./filebeat -e -c filebeat.yml -d "Publish" & > nohup.out
后台启动不生成日志
./filebeat -e -c filebeat.yml -d "Publish" >/dev/null 2>&1 &
关键在于最后的 >/dev/null 2>&1 部分,/dev/null是一个虚拟的空设备(类似物理中的黑洞),任何输出信息被重定向到该设备后,将会石沉大海 /dev/null 表示将标准输出信息重定向到"黑洞" 2>&1 表示将标准错误重定向到标准输出(由于标准输出已经定向到“黑洞”了,即:标准输出此时也是"黑洞",再将标准错误输出定向到标准输出,相当于错误输出也被定向至“黑洞”)
2、logstash 启动
后台启动生成日志文件
进入logstash-..*目录下 我这里为了方便把logstash-sample.conf 文件放在了bin目录下 nohup ./bin/logstash -f bin/logstash-sample.conf & > nohup.out
后台启动不生成日志
./bin/logstash -f bin/logstash-sample.conf >/dev/null 2>&1 &
3、启动elasticsearch
后台启动生成日志
进入elastic-..*/bin 目录下 nohup ./elasticsearch & > nohup.out
后台启动不生成日志
./elasticsearch >/dev/null 2>&1 &
八、ELK+filebeat
参考文件:https://blog.csdn.net/wsdc0521/article/details/106308441/
以上已经实现了logstash采集日志存储至ES,然后kibana展示。为避免logstash作为日志采集器客户端占用资源过大,在原有基础上增加一个filebeat。即设置机器作为Logstash的服务端。其他存有日志的机器上安装轻量级的filebeat作为日志采集器(安装包才十几M)。
部署Logstash服务端
1、部署Logstash服务端
注意:此处安装在192.168.227.88机器上作为服务端接收filebeat
在需要对接日志的机器上安装logstash,然后对接elasticsearch主机。
logstash下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.tar.gz
以下是脚本,快速创建修改目录以及安装logstash
appdeploy@CDT-SIT-APP-03:~$ cat logstash_install.sh
#!/bin/bash
#创建elk用户
useradd elk
#创建相关目录
mkdir /usr/elk
mkdir -p /data/elk/logstash/data
mkdir -p /data/elk/logstash/logs
#安装logstash
tar -xf logstash-7.0.1.tar.gz
mv logstash-7.0.1 /usr/elk/logstash-7.0.1
echo "path.data: /data/elk/logstash/data" >> /usr/elk/logstash-7.0.1/config/logstash.yml
echo "path.data: /data/elk/logstash/logs" >> /usr/elk/logstash-7.0.1/config/logstash.yml
chown -R elk:elk /data/elk
chown -R elk:elk /usr/elk
2、建立conf文件
首先,logstash服务端按配置好的规则从每台filebeat服务器上接收log,收集好后发送给elasticsearch,elasticsearch再创建索引并存储,最后再通过kibana结合es从web界面进行查询和展示。
了解流程后,需要了解logstash是怎么从filebeat收集数据的。这里,就需要建立conf文件了。如下:
以下是采集多个日志分别推送至es创建索引,有nginx和java得日志,通过if语句判断存储至指定索引。
root@logstash:/usr/elk/logstash-7.0.1/config# vi logstash.conf
input {
beats {
port => 5044
}
}
output {
if [tags][0] == "charge-service-9266"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "cec-evcs-charge-service-9266-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "data-service-9267"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "cec-evcs-data-service-9267-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "data-service-msg"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "cec-evcs-data-service-msg-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "chargemgmtapp-9216-error"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "cdt-chargemgmtapp-9216-error-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "saas-pay-data-service-info"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "saas-pay-data-service-info-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "saas-pay-data-service-error"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "saas-pay-data-service-error-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "saas-pay-platform-service-info"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "saas-pay-platform-service-info-%{+YYYY.MM.dd}"
}
}
if [tags][0] == "saas-pay-platform-service-error"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "saas-pay-platform-service-error-%{+YYYY.MM.dd}"
}
}
}
3、执行启动Logstash
su elk
/usr/elk/logstash-7.0.1/bin/logstash -f /usr/elk/logstash-7.0.1/config/input-output.conf --config.reload.automatic >/dev/null &
被控端部署filebeat
安装包连接:wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.1-linux-x86_64.tar.gz
1、准备filebeat客户端采集日志
useradd elk
#创建相关目录
mkdir /usr/elk
mkdir -p /data/elk/
mkdir -p /data/elk/
#安装filebeat
tar -xf filebeat-7.0.1.tar.gz
mv logstash-7.0.1 /usr/elk/logstash-7.0.1
chown -R elk:elk /data/elk
chown -R elk:elk /usr/elk
2、修改conf文件
这台机器接入java日志
appdeploy@CDT-SIT-APP-03:/usr/elk/filebeat-7.0.1$ cat filebeat_min.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/logs/cec-evcs-data-service-msg.log
tags: ["service-msg"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
output.logstash:
hosts: ["192.168.227.88:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
这台机器接入nginx日志
root@CDT-PT-NGINX-02:/home/appdeploy# cat /usr/elk/filebeat-7.0.1/filebeat2.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/test2.log
tags: ["test_nginx"]
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
output.logstash:
hosts: ["192.168.227.88:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
3、启动filebeat
nohup /usr/elk/filebeat-7.0.1/filebeat -e -c /usr/elk/filebeat-7.0.1/filebeat.yml >/dev/null 2>&1 &