使用轻量级的日志监控工具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