用ElastAlert实现日志报警

Elastalert是Yelp公司用python2.6写的一个报警框架,github地址为
https://github.com/Yelp/elastalert
Elastalert通过查询ElasticSearch中的记录进行比对,对服务报警规则对日志发送报警邮件。Elastalert支持对报警规则有:

  1. blacklist类型 说明:黑名单规则将检查黑名单中的某个字段,如果它在黑名单中则匹配。
  2. whitelist类型 说明:与黑名单类似,此规则将某个字段与白名单进行比较,如果列表中不包含该字词,则匹配。
  3. change类型 说明:此规则将监视某个字段,并在该字段更改时进行匹配,该领域必须相对于最后一个事件发生相同的变化。
  4. frequency类型 说明:当给定时间范围内至少有一定数量的事件时,此规则匹配。 这可以按照每个query_key来计数
  5. spike类型 说明:当某个时间段内的事件量比上一个时间段的spike_height时间大或小时,这个规则是匹配的。它使用两个滑动窗口来比较事件的当前和参考频率。 我们将这两个窗口称为“参考”和“当前”。
  6. flatline类型 说明:当一个时间段内的事件总数低于一个给定的阈值时,匹配规则。
  7. cardinality类型 说明:当一个时间范围内的特定字段的唯一值的总数高于或低于阈值时,该规则匹配
  8. percentage match类型 说明:当计算窗口内的匹配桶中的文档的百分比高于或低于阈值时,此规则匹配。计算窗口默认为buffer_time。

Elastalert支持对报警方式有:
Email
JIRA
OpsGenie
Commands
HipChat
MS Teams
Slack
Telegram
AWS SNS
VictorOps
PagerDuty
Exotel
Twilio
Gitter
此外也能自己进行定制开发,如使用微信接口进行实现微信推送报警
https://segmentfault.com/a/1190000017553282
https://www.freebuf.com/sectool/164591.html

我这次对目标是对爬虫的运行状态进行报警。设想是使用filebeat将爬虫日志输入logstash,处理后存入elasticsearch数据库,分布针对不同的网站进行不同方式的报警。
elastalert报警的规则有三种:rule1,出现error字样就报警,rule2,一分钟出现5次error报警,rule3,出现“已删除”字样就报警。都已邮件的形式发送到系统管理员。
操作步骤如下:
Elk and elastalert
所需软件: elasticsearch, logstash, kibana, elastalert
172.17.101.164: elasticsearch,logstash.kibana
172.17.101.166: elastalert
Elasticsearch port: 9200
Logstash port: 9600
Kibana port: 5601
Config file: /etc//.yml
Software file: /usr/share//bin/
*指软件名
Elasticsearch
Version: 6.5.3
下载链接: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.rpm
配置文件:elasticsearch.yml

Path: /etc/elasticsearch/elasticsearch.yml
Log: /var/log/elasticsearch
Data: /var/lib/elasticsearch
Output network:
Network.host: 172.17.101.164
http.port: 9200

Logstash
Version: 6.5.3
下载链接:https://artifacts.elastic.co/downloads/logstash/logstash-6.5.3.rpm
配置文件: logstash.yml 和 logstash.conf
Path: /etc/logstash/logstash.yml or logstash.conf
Logstash.yml

path.data: /var/lib/logstash
http.host: "172.17.101.164"
path.data: /var/lib/logstash

Logstash.conf

input {
  beats {
    port => 9600 #port9600接收所有filebeat文件
  }
}
filter {
  grok{ #匹配三种message
    match=> {
"message"=>"%{DATA:date}]%{DATA:index}]%{WORD:location}]%{GREEDYDATA:information}"
     }
    match=> {
"message"=>"%{DATA:date}]%{DATA:index}]%{GREEDYDATA:information}"
     }
    match=> {
"message"=>"%{DATA:date} %{DATA:time} -%{WORD:location}-%{WORD:status}-%{GREEDYDATA:information}"
     }
  }
  mutate {
    remove_field =>['tags','beat','host',’message’] #删除不需要的数据
  }
}
output {
  stdout {
     codec => rubydebug { }
  }
# 通过不同的field的值来区分不同种类的文件,同时用不同的index来区分他们,方便后面elastalert或者kibana获取数据
# 所有的output都指向172.17.101.164:9200
  if [fields][service] == "fanwen"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "fanwen"
    }
  }
  if [fields][service] ==  "changshu"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "changshu"
    }
  }
  if [fields][service] ==  "gaoxin"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "gaoxin"
    }
  }

  if [fields][service] ==  "gusu"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "gusu"
    }
  }

  if [fields][service] ==  "gzjd"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "gzjd"
    }
  }

  if [fields][service] ==  "hswz"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "hswz"
    }
  }
    if [fields][service] ==  "kunshan"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "kunshan"
    }
  }

  if [fields][service] ==  "wujiang"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "wujiang"
    }
  }

  if [fields][service] ==  "taicang"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "taicang"
    }
  }

  if [fields][service] ==  "wuzhong"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "wuzhong"
    }
  }

  if [fields][service] ==  "xiangcheng"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "xiangcheng"
    }
  }

  if [fields][service] ==  "ylb"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "ylb"
    }
  }
  if [fields][service] ==  "yuanqu"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "yuanqu"
    }
  }

  if [fields][service] ==  "zhangjiagang"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "zhangjiagang"
    }
  }
  if [fields][service] ==  "ip"
  {
    elasticsearch {
      hosts => "172.17.101.164:9200"
      index => "ip"
    }
  }
}
 Grok match
%{DATA:date}]%{DATA:index}]%{WORD:location}]%{GREEDYDATA:information}
Matches
[2018-12-12 23:56:56][0][hswz]ip:12131213232231

%{DATA:date}]%{DATA:index}]%{GREEDYDATA:information}
Matches
[2018-12-12 23:56:56][0]ip:12131213232231

%{DATA:date} %{DATA:time}-%{WORD:location}-%{WORD:status}-%{GREEDYDATA:information}
Matches
2018-12-12 23:56:56-hswz-INFO-ip:127.1.1.0 (just an instance)

Filebeat
Version: 6.5.3
下载链接:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.3-x86_64.rpm
配置文件:filebeat.yml
Path: /etc/filebeat/filebeat.yml
Filebeat.yml

IpProxy: 172.17.101.164
filebeat.prospectors:
filebeat.inputs:
- input_type: log
  encoding: utf-8
  paths: #要传输到logstash的log的地址
  - /data/ipProxy*
  fields:
      service: ip #没啥用,用来区分不同log文件
filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false
output.logstash:
hosts: ["172.17.101.164:9600"]

yuqing and fanwen: 172.17.101.240 password: Pass@1234
filebeat.prospectors:
- input_type: log
  encoding: utf-8
  paths:
  - /data/fanwen/*/logs/*
  fields:
      service: fanwen
- input_type: log
  encoding: utf-8
  paths:
  - /data/yuqing/yuanqu/logs/*
  fields:
      service: yuqing
filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false
output.logstash:
hosts: ["172.17.101.164:9600"]

Elastalert
安装教程: http://blog.51cto.com/seekerwolf/2121070
Path:/usr/local/elastalert 172.17.101.166
运行指令:python -m elastalert.elastalert –config config.yaml (在elastalert文件夹运行)
Elastalert.yml

# 定义基本信息
rules_folder: /usr/local/elastalert/example_rules

# How often ElastAlert will query Elasticsearch
# The unit can be anything from weeks to seconds
run_every:
  minutes: 1

# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 15

# The Elasticsearch hostname for metadata writeback
# Note that every rule can have its own Elasticsearch host
es_host: 172.17.101.164

# The Elasticsearch port
es_port: 9200

Rule

  1. Rule1 fanwen
# 只要status为ERROR就报警
# (Optional)
# Elasticsearch host
es_host: 172.17.101.164

# (Optional)
# Elasticsearch port
es_port: 9200

# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword
name: fanwen
type: blacklist
index: fanwen

timeframe:
    minutes: 1

compare_key: status

blacklist:
    - "error"
    - "ERROR"

smtp_host: smtp.csztv.com
smtp_port: 25
smtp_auth_file: /usr/local/elastalert/example_rules/smtp_auth_file.yaml
email_reply_ro: 648833723@qq.com
from_addr: mocha@csztv.com
alert:
- "email"

email:
- "648833723@qq.com"
- "tml@csztv.com"
- "zhangyongshu@csztv.com"
- “limingfeng@csztv.com”
  1. Rule2 yuqing
# 一分钟status出现五次ERROR
es_host: 172.17.101.164
es_port: 9200
name: changshu

type: frequency
index: changshu

num_events: 5

timeframe:
  minutes: 1

filter:
- query:
    query_string:
      query: "status: ERROR or error"
smtp_host: smtp.csztv.com
smtp_port: 25
smtp_auth_file: /usr/local/elastalert/example_rules/smtp_auth_file.yaml
email_reply_ro: 648833723@qq.com
from_addr: mocha@csztv.com
alert:
- "email"

email:
- "648833723@qq.com"
- "tml@csztv.com"
- "zhangyongshu@csztv.com"
- "limingfeng@csztv.com"
  1. Rule3 ip
# 出现“已删除“马上报警
# Alert when the rate of events exceeds a threshold

# (Optional)
# Elasticsearch host
es_host: 172.17.101.164

# (Optional)
# Elasticsearch port
es_port: 9200

# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword
name: ip has run out
type: blacklist
index: ip

timeframe:
    minutes: 1

compare_key: information

blacklist:
    - "已删除"

smtp_host: smtp.csztv.com
smtp_port: 25
smtp_auth_file: /usr/local/elastalert/example_rules/smtp_auth_file.yaml
email_reply_ro: 648833723@qq.com
from_addr: mocha@csztv.com
alert:
- "email"

email:
- "648833723@qq.com"
- "tml@csztv.com"
- "zhangyongshu@csztv.com"
- "limingfeng@csztv.com"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,308评论 0 9
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,758评论 0 15
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,961评论 6 13
  • 你喜欢自己吗?相信有一大批人的答案是:不喜欢。 这个每天朝夕相处的自己,你却不喜欢,那你生活的开心吗?愉悦吗?答案...
    展颜展颜阅读 728评论 2 14
  • 岁在丁酉,壬子壬辰, 是为西历,元旦前夕, 正迎新年,遍发微信, 忽传噩耗,不忍听闻: 昔师陈公,名讳寿印, 作别...
    顾初轩阅读 729评论 4 0