现在大部分公司都会选择将应用、中间件、系统等日志存储在 Elasticsearch 中,如何发现日志中的异常数据并且及时告警通知就显得十分重要。本文将会介绍两种主流的日志监控方案,分别是 Yelp 公司开源的 ElastAlert 和 Elastic 官方的商业版功能 Watcher。
如下图所示,日志数据源是一台 Nginx 服务器,在该服务器上安装 Filebeat 收集 Nginx 日志并输出到 Elasticsearch,之后会分别演示用 ElastAlert 和 Watcher 两种方案监控日志并进行告警。

部署 Nginx
安装依赖
yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree zlib-devel
下载安装包
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xzvf nginx-1.14.0.tar.gz
编译安装
cd nginx-1.14.0
./configure
配置 Nginx
编辑配置文件 /usr/local/nginx/conf/nginx.conf,在 Nginx 上配置一个静态网页服务。
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
root html;
}
}
}
启动 Nginx:
sbin/nginx
访问 Nginx:

部署 Filebeat
下载并安装 Filebeat。
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.0-x86_64.rpm
sudo rpm -vi filebeat-7.14.0-x86_64.rpm
编辑 /etc/filebeat/filebeat.yml 配置文件,读取 Nginx 日志文件输出到 Elasticsearch 的 nginx 索引中,后缀是当前日期。
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/*.log
output.elasticsearch:
hosts: ["192.168.1.8:9200"]
index: "nginx-%{+yyyy.MM.dd}"
#username: "elastic"
#password: "changeme"
setup.ilm.enabled: false
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
启动 Filebeat:
systemctl start filebeat
ElastAlert
ElastAlert 是 Yelp 公司开源的一套用 Python 写的 Elasticsearch 告警框架,可以从 Elasticsearch 当中查询出匹配规则的数据进行告警。
ElastAlert 有以下特点:
- 支持多种匹配规则(频率、阈值、数据变化、黑白名单、变化率等)。
- 支持多种告警类型(邮件、HTTP POST、自定义脚本等)。
- 支持用户自定义规则和告警类型。
- 匹配项汇总报警,重复告警抑制,告警失败重试和过期。
- 可用性强,状态信息保存到 Elasticsearch 的索引中。
- 支持调试和审计。
部署 Elastalert
安装 Python
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
tar -zxvf Python-3.6.9.tgz
cd Python-3.6.9
./configure
make && make install
检查 Python 版本:
python3 -V
安装依赖
yum install gcc libffi-devel python3-devel openssl-devel -y
pip3 install -U pip
pip3 install "setuptools>=11.3"
安装 Elastalert
python3 install elastalert
配置 Elastalert
克隆代码到本地:
git clone https://github.com/Yelp/elastalert.git
cd elastalert
我们可以在 ElastAlert 源码文件的根目录下找到一个叫做 config.yaml.example 的文件,修改文件名为 config.yaml:
mv config.yaml.example config.yaml
创建存放规则的目录。
mkdir rules
cd rules
编辑 config.yaml 文件,修改主配置:
#规则存放的目录
rules_folder: rules
#运行的频率
run_every:
minutes: 1
#ElastAlert 将缓存最近一段时间的结果,以防某些日志源不是实时的
buffer_time:
minutes: 45
#Elasticsearch 地址
es_host: 192.168.1.8
#Elasticsearch 端口
es_port: 9200
#Elasticsearch 用户名密码(可选)
#es_username: someusername
#es_password: somepassword
#ElastAlert 元数据存储索引
writeback_index: elastalert_status
#如果警报因某种原因失败,ElastAlert将重试发送警报,直到该时间段结束
alert_time_limit:
days: 2
创建 rules/nginx.yaml 文件,编辑 rule:
规则内容为:在 1 分钟内如果查询 nginx-* 索引的 message 字段匹配 到 error 5 次就触发告警,往指定的 URL 发送一个 HTTP POST 请求。
# Alert when the rate of events exceeds a threshold
# (Required)
<

本文介绍了如何使用ElastAlert和Watcher两种工具对Nginx日志进行监控和告警。首先,部署Nginx并配置Filebeat将日志推送到Elasticsearch。然后,通过ElastAlert创建规则,当在1分钟内有5次'error'日志时触发HTTP POST告警。最后,展示了使用Watcher创建定时任务,监控含有'error'的日志,并同样发送HTTP POST告警。这两个工具都提供了灵活的规则配置和多种告警方式。

4257

被折叠的 条评论
为什么被折叠?



