轻量级的日志监控与告警-monit
使用轻量级的日志监控工具monit,对日志中的异常进行实时报警。 monit是一个Linux系统的管理和监控工具,文件监控是包含的功能之一。
日志告警的需求:
定期监控日志文件,如每个3s一次;
检查日志文件是否有匹配某些关键词的内容,如 error, warning, exception;
每次只做增量检查,满足检查条件时发送告警;
告警条件可以排除某些条件,减少误报;
避免泛洪式告警:每一个周期的检查,即使命中多行,也只发送一次告警,告警中把当前周期检查到的匹配内容全部发出;
告警同时发送到邮件,以及实时IM,如Slack;
参考:monit完整的介绍
monit能够满足上面的这些需求。 不过发送的告警邮件中,中文有乱码,可以通过调用外部脚本告警来避免乱码。
外部脚本通过环境变量取到告警的服务名,事件,描述,而由于monit检查文件内容时,每一行只检查前面的511个字符,会做文本截取,所以外部脚本能读到的日志不超过200个中文字符。这个问题可以通过修改monit源代码来解决。
##文件监控: https://mmonit.com/monit/documentation/monit.html#FILE-CONTENT-TESTING
$monit -c /etc/monit.conf
##告警规则配置: IF [NOT] MATCH {regex|path} THEN action IGNORE [NOT] MATCH {regex|path} monit启动时,会从文件的末尾开始读内容;下一次扫描时,会从上一次读到的位置扫描到文件末尾。
##检查规则示例:
check file syslog with path /var/log/syslog
ignore match "^monit"
if match "^mrcoffee" then alert
if match “ApiOrderService.php:pay.*already payed" then alert
if match “(warning|error)" then exec '/usr/bin/python /data/monitor.py'
exec: execute a program and send alert.
正则匹配错误和告警日志: (error|warning)
##配置Gmail邮件告警: set mailserver smtp.gmail.com port 587 username “MYUSER” password “MYPASSWORD” using tlsv12
##设置多个收件人一行一个: set alert address1@hidden # Alert system admin on any event set alert address@hidden # Alert system admin on any event
##发送邮件中文乱码 改成用exec调用脚本来发送邮件
##Python脚本: if match “^mrcoffee" then exec “/usr/bin/python /data/monitor.py”
#coding: utf-8
# script to exec for monit, monitor errors in log file
import os,json
from email.Utils import formatdate
service = os.environ['MONIT_SERVICE']
date = os.environ['MONIT_DATE']
environment = ''
for key in os.environ.keys():
if 'MONIT' in key:
environment = environment + '<br>\n'+ key + ':'+ os.environ[key]
#print(environment)
with open("/alidata/log/output.txt","ab") as file:
file.write(environment + '\n')
#发送告警到Slack:
from slacker import Slacker
slack = Slacker('slack_token')
slack.chat.post_message('#monitoring', service + ' warning ' + environment )
##exec调用脚步发送的告警,取到的告警描述不完整。 因为monit解析每一行日志,只解析前面的511个字符。
源码里面找到限制的地方改掉,然后重新编译,安装:
grep -r 512 *
vim src/validate.c