网络知识 娱乐 ELK(EFKE)日志告警监控系统集成笔记

ELK(EFKE)日志告警监控系统集成笔记

目录

    • 前言
    • 集成之路
      • 1.新建网络
      • 2.Elasticsearch
        • 2.1 docker拉取Elasticsearch镜像
        • 2.2 创建elasticsearch目录
        • 2.3 修改Elasticsearch目录权限
        • 2.4 创建Elasticsearch配置文件elasticsearch.yml
        • 2.5 配置文件内容:
        • 2.6 docker 启动容器
        • 2.7 docker 部署elasticsearch简便方式
      • 3.Kibana
        • 3.1 docker 拉取Kibana镜像:
        • 3.2 启动Kibana容器:
      • 4.Filebeat
        • 4.1 docker 拉取Filebeat镜像:
        • 4.2 创建Filebeat目录:
        • 4.3 新建Filebeat配置文件
        • 4.4 配置文件内容:
        • 4.5 启动Filebeat
      • 5.Elastalert
        • 5.1 安装:
        • 5.2 创建elastalert索引:
        • 5.3 新建elastalert配置config.yaml:
        • 5.4 config.yaml内容:
        • 5.5 cd到规则目录,新建配置告警规则:
        • 5.6 frequency.yaml内容:
        • 5.7 配置邮箱认证文件:
        • 5.8 smtp_auth_file.yaml内容:
        • 5.9 测试告警规则:
        • 5.10 配置钉钉告警还需要安装钉钉插件:
        • 5.11 后台启动elastalert:
        • 5.12 监控告警效果:

前言

最近在搞公司项目系统架构优化,要弄一套日志监控管理系统,百度一下市面上比较火的就是Elastic公司的ELK框架,即Elasticsearch、Logstash和Kibana,日志监控用的是Elastalert,于是借鉴了一下网上的文章,开启自己搭建日志监控系统之路,顺便记录一下,方便以后忘记了再查阅巩固。
这里还要说明一下,Elasticsearch是用于日志的存储和检索,Logstash用于日志的收集并输出到Elasticsearch存储,Kibana则是前端界面,负责对Elasticsearch中的数据进行展示和可视化分析。前期经过调研发现Logstash日志收集系统比较占用CPU资源,最后选用Filebeat来替代。

集成之路

前提:所有东西都是采用docker直接部署,所以先要保证服务器有docker环境,方便省事。

1.新建网络

保证所有东西运行都在统一网络下

docker network create elk

2.Elasticsearch

2.1 docker拉取Elasticsearch镜像

首先需要部署的就是Elasticsearch,docker先把Elasticsearch镜像拉下来:

docker pull elasticsearch:7.14.1

2.2 创建elasticsearch目录

Elasticsearch既然是用于存储的,首先得让Elasticsearch安装到磁盘最大的路径下,我这里最大的是home路径下:

mkdir -p /home/elasticsearch/{config, data}

2.3 修改Elasticsearch目录权限

因为Elasticsearch默认是不让root用户启动的,所以docker启动的时候默认为将启动用户修改成用户id为1000的系统用户,如果是root用户新建的目录,Elasticsearch启动后是没有操作权限,会启动失败的。

chmod 777 /home/elasticsearch/{config, data}

2.4 创建Elasticsearch配置文件elasticsearch.yml

vim /home/elasticsearch/config/elasticsearch.yml

2.5 配置文件内容:

cluster.name: my-es
node:
  name: es-node-0  
network.host: 0.0.0.0
# 允许通过本机所有IP访问
http.host: 0.0.0.0   
http.port: 9200
# 关闭用户密码验证
xpack.security.enabled: false
# 是否支持跨域,默认为false
http.cors.enabled: true
http.cors.allow-origin: "*"

2.6 docker 启动容器

docker run -d --name elasticsearch --net elk --restart always 
-p 9200:9200 -p 9300:9300  
-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" 
-e "discovery.type=single-node" 
-v /home/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 
-v /home/elasticsearch/data:/usr/share/elasticsearch/data 
elasticsearch:7.14.1

验证是否部署成功,直接访问 http://服务器ip:9200/,返回如下则说明部署成功:

{
  "name" : "es-node-0",
  "cluster_name" : "my-es",
  "cluster_uuid" : "POffkg-FSRma_M50ukFfvg",
  "version" : {
    "number" : "7.14.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "66b55ebfa59c92c15db3f69a335d500018b3331e",
    "build_date" : "2021-08-26T09:01:05.390870785Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

2.7 docker 部署elasticsearch简便方式

投机取巧的另一种方法,Elasticsearch集群部署,直接一个脚本搞定所有操作,新建脚本docker_create_es.sh**

vim /home/elasticsearch/docker_create_es.sh

脚本内容:

for port in $(seq 0 2); 
do 
mkdir -p /home/elasticsearch/master-${port}/config
mkdir -p /home/elasticsearch/master-${port}/data
chmod -R 777 /home/elasticsearch/master-${port}
cat << EOF > /home/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es  
node:
  name: es-node-${port}  
network.host: 0.0.0.0
http.host: 0.0.0.0   
http.port: 920${port}
discovery.seed_hosts: ["xx.xx.xx.xx:9300","xx.xx.xx.xx:9301","xx.xx.xx.xx:9302"]
cluster.initial_master_nodes: ["es-node-0"] 
xpack.security.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"

EOF

docker run --name elasticsearch-node-${port} 
-p 920${port}:920${port} -p 930${port}:930${port} 
--network=elk 
-e ES_JAVA_OPTS="-Xms1g -Xmx1g"  
-v /home/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml  
-v /home/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data  
-v /home/elasticsearch/master-${port}/plugins:/usr/share/elasticsearch/plugins  
-d elasticsearch:7.14.1
done

3.Kibana

3.1 docker 拉取Kibana镜像:

docker pull kibana:7.14.1

3.2 启动Kibana容器:

docker run -d --name kibana --net elk --restart always -p 5601:5601 kibana:7.14.1

浏览器打开http://服务器ip:5601/,如果页面显示

Kibana server is not ready yet

说明Kibana没有找到Elasticsearch路径,默认还是http://elasticsearch:9200
进入Kibana命令行,修改kibana.yml中的Elasticsearch路径:

docker exec -it kibana /bin/bash

执行完之后显示如下:

[root@localhost home]# docker exec -it kibana /bin/bash
bash-4.4$ 

编辑kibana.yml

vi config/kibana.yml

修改elasticsearch.hosts
在这里插入图片描述
重启Kibana,浏览器打开 http://服务器ip:5601/

docker restart kibana

你就可以看到如下界面了
在这里插入图片描述

4.Filebeat

4.1 docker 拉取Filebeat镜像:

docker pull elastic/filebeat:7.14.1

4.2 创建Filebeat目录:

mkdir -p /home/filebeat/config
chmod 777 /home/filebeat/config

4.3 新建Filebeat配置文件

vim /home/filebeat/config/filebeat.yml

4.4 配置文件内容:

filebeat.inputs:
- type: log #类型是log日志
  enabled: true #是否启用
  paths: #docker日志路径
  - /home/docker/containers/1382a029488b1e577986d2d92d801e58112fc2d82c948624fb4cf39851a97f47/1382a029488b1e577986d2d92d801e58112fc2d82c948624fb4cf39851a97f47-json.log
  include_lines: ["ERROR", "Exception"] #过滤字段  只收集包括过滤字段的日志
  fields:
    type: bootstrap-8008-error  #自定义字段  用来判断创建索引
  encoding: UTF-8
  tail_files: true  # 设为true时表示 读取文件最新的内容 而不是从头读
  json.key_under_root: true #开启自定义字段
  json.overwrite_keys: true
  json.message_key: log # 筛选json日志中的log字段  意思就是只读取log字段中的内容
  json.add_error_key: true
  #读取多行日志配置   用于出错时读取多行错误日志
  multiline.pattern: '^d{4}-d{2}-d{2}'
  multiline.negate: true
  multiline.match: after


setup.ilm.enabled: false  # 自定义ES的索引需要把ilm设置为false

setup.kibana:
  host: "ip:5601"

output.elasticsearch:
  hosts: ['ip:9200', 'ip:9201', 'ip.133:9202'] #配置elasticsearch
  enable: true
  username: elastic #配置elasticsearch用户名密码   如果没有可以不设置
  password: SCEceIotSpvTYeaub6X*
  indices: #设置索引
    - index: "gateway-bootstrap-error-%{+yyyy.MM.dd}"
      when.equals:
        fields.type: "bootstrap-8008-error"

4.5 启动Filebeat

docker run -d --name filebeat --restart=always 
--log-driver json-file 
--log-opt max-size=100m 
--log-opt max-file=2  
-v /home/logs:/home/logs 
-v /home/docker/containers:/home/docker/containers 
-v /home/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml 
elastic/filebeat:7.14.1

注意,如果Filebeat读取日志失败,多半是Filebeat的启动用户没有日志路径的操作权限,记得chmod 777改一下权限。
至此,EFK部署已完成,打开kibana,就可以看到Filebeat采集的日志索引了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置一下索引展示,就可以实时查看收集的日志信息了,这里注意下kibana 8.0以上的版本没有Index Pattern这个选项了,变成Date View了,但是创建索引展示信息配置基本都是相同的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到日志信息了:
在这里插入图片描述

5.Elastalert

ElastAlert是一个简单的框架,用于从Elasticsearch中的数据中发出异常,它通过将Elasticsearch与两种类型的组件(规则类型和警报)结合使用。定期查询Elasticsearch,并将数据传递到规则类型,该规则类型确定找到任何匹配项。发生匹配时,它会发出一个或多个警报,这些警报根据不同的类型采取相应的措施。
Elastalert的安装部署需要Python环境,请先提前安装,建议安装Python-3.6.9版本。
从github下载Elastalert源码:

git clone https://github.com/Yelp/elastalert.git

5.1 安装:

cd elastalert/
pip3 install "setuptools>=11.3"
python3 ./setup.py install

# 报错(pip:No module named setuptools_rust)解决办法
pip3 install setuptools-rust

5.2 创建elastalert索引:

elastalert-create-index

5.3 新建elastalert配置config.yaml:

vim /home/elastalert/config.yaml

5.4 config.yaml内容:

rules_folder: /home/elastalert/rules  #指定告警规则文件目录
run_every:
  seconds: 60 #查询Elasticsearch的时间间隔
buffer_time:
  minutes: 3
es_host: xx.xx.xx.xx #elasticsearch IP
es_port: 9200 #elasticsearch端口
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
#失败重试次数
alert_time_limit:
  days: 2

5.5 cd到规则目录,新建配置告警规则:

cd elastalert/rules
vim frequency.yam

5.6 frequency.yaml内容:

name: app-admin rule #规则名称, 若重复只会运行最新的一条

type: frequency  #规则类型

index: app-admin-info-* #要监控的索引  app*表示匹配所有以app开头的索引

num_events: 3  #触发事件数

timeframe:
   minutes: 2   #触发时间间隔

compare_key: json.log  #要监控的字段

blacklist: #黑名单  
    - "Exception"  
    - "ERROR"  #整体配置的效果是若json.log字段中在两分钟内出现3次及以上的ERROR字段,则会触发告警,这里不区分大小写。

smtp_host: smtp.163.com  #邮箱host  这里用的的是163邮箱,不同邮箱配置有差异
smtp_port: 25
#指定邮箱的认证文件  这里主要是邮箱名和授权码  授权码需要登录邮箱去设置
smtp_auth_file: /home/elastalert/config/smtp_auth_file.yaml
email_reply_to: xxxxxxxxxx@163.com  #配置回复邮箱
from_addr: xxxxxxxx@xxx.com  #配置发出告警信息的邮箱  一般为公司或部门邮箱
 
alert: #指定告警方式
 - "elastalert_modules.dingtalk_alert.DingTalkAlerter" #钉钉告警
 - "email" #邮箱告警
#这里access_token从群机器人中配置获取
dingtalk_webhook: "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
dingtalk_msgtype: "text"  #指定消息类型为text
 
email:
 - "xxx@xxx.com"  #配置接收告警信息的邮箱  可以指定多个

alert_text_type: alert_text_only   #配置告警信息类型,一般为alert_text_only若不指定会把所有字段都返回
alert_subject: "监控告警"  #配置告警标题
#配置告警内容
alert_text: "您有一条告警信息: n时间:{0}n级别:高n关键字:ERROR、Exception nIP:{3} n轮询时间:2分钟 n限制次数:{4}次n出现次数: {2}次 n请及时登录Kibana查看n地址: http://ip:5601/ n主要信息如下:nn{1} n "
#指定输出字段
alert_text_args:
 - "@timestamp"
 - json.log
 - num_hits
 - fields.ip
 - num_events

5.7 配置邮箱认证文件:

vim /home/elastalert/config/smtp_auth_file.yaml

5.8 smtp_auth_file.yaml内容:

user: xxxxxx@163.com #邮箱名称
password: XXXXXXXXXXXX #授权码  需登录邮箱配置获取

5.9 测试告警规则:

elastalert-test-rule rules/frequency.yaml

5.10 配置钉钉告警还需要安装钉钉插件:

#github下载插件
wget https://github.com/xuyaoqiang/elastalert-dingtalk-plugin/archive/master.zip
#解压
unzip elastalert-dingtalk-plugin-master.zip
#cd到插件根目录
cd elastalert-dingtalk-plugin-master
#安装pyOpenSSL
pip3 install pyOpenSSL==16.2.0
#安装setuptools
pip3 install setuptools==46.1.3
#将elastalert_modules文件夹 复制到elastalert根目录下
cp -r elastalert_modules /home/elastalert/

5.11 后台启动elastalert:

nohup python -m elastalert.elastalert --config /home/elastalert/config.yaml --rule /home/elastalert/rules/frequency.yaml 2>&1 &

5.12 监控告警效果:

在这里插入图片描述