Zabbix的用户一定会碰到这种情况:

日志报警一般设置的是multiple模式,有错误大量写入的时候,每写入一行就会触发一次action,导致出现大量的报警邮件。

特别是ora的报警,经常一出就是上千条,有时候会让别的报警都淹没在ora的邮件中。

这时候就考虑能不能让日志的报警汇总,同样的内容在一定的时间内只发送一封邮件。

基本思想就是:

1,日志写入à触发actionà将报警内容写入数据库

2,Crontab定期查询数据库à有报警就汇总发送邮件à发送完成后清空数据表

详细步骤如下:

1,zabbix上的设置

administratoràMediaTypes ,新建MediaTypes(writetodb),type选择Script,脚本名称命名为writetodb.py

administratoràUsers ,新建User(writetodb),Media中添加刚才新建的MediaType(writetodb)

ConfigurationàActions,新建Action(log error),Operation中设置Sendmessage给刚才新建的用户(writetodb),

Conditions中把日志的监视都填进去,其他的设置如报警的内容等请自行填写

到这里zabbix就设置完了。

2,mysql设置

新建数据库

Create database alert;

新建数据表nowalert

Create table nowalert
      (
      Time varchar(),
      Title varchar()
      Value varchar()
      );

新建数据表passalert

Create table passalert like nowalert;

新建视图alertsum

Create view alertsum (Time, Title , Value, Count)
    as
    select Time, Title, Value, Count(*)
    from nowalert
    group by Value;

3,写入数据库的脚本 

cd /usr/lib/zabbix/alertscripts/
vim writetodb.py

脚本内容

#!/usr/bin/python

import sys
import MySQLdb
import datetime

#捕捉zabbix传过来的参数2和3
subject = str(sys.argv[2])
body = str(sys.argv[3])
#定义时间以及格式
now = datetime.datetime.now()
time = now.strftime("%Y.%m.%d %H:%M:%S")

#以列表形式定义要插入数据表的内容
error = []
error.append(time)
error.append(subject)
error.append(body)

#将error插入数据表
    conn = MySQLdb.connect(host='localhost',user='zabbix',passwd='xxxxxx',port=3306,db='alert')
    cur = conn.cursor()
try:
    cur.execute('insert into nowalert values(%s,%s,%s)',error)
    conn.commit()
except
    conn.rollback()
conn.close()
chmod +x writetodb.py

4,发邮件脚本

新建地址簿

mkdir addresslist
vim addresslist /ServerTeam

to和cc之间用##隔开,多个邮箱之间用逗号隔开

aaa@xxx.com##bbb@xxx.com,ccc@xxx.com

发送邮件脚本(更新)

2016/12/9 :增加了邮件的retry(3次),增加了各个模块的日志记录,改善了代码结构

vim sendmail.py
#!/usr/bin/python
#-*- coding:utf-8 -*-

import MySQLdb
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import logging
import os
import datetime

LOGFILE = datetime.datetime.now().strftime('%Y-%m-%d')+'.log'
LOGDIR = os.path.join(os.getcwd(),"log")
logger = logging.getLogger()
hdlr = logging.FileHandler(os.path.join(LOGDIR,LOGFILE),'a')
formatter = logging.Formatter('%(asctime)s: %(process)d %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.NOTSET)

def mysql(sql):
    try:
        conn = MySQLdb.connect(host='localhost',user='zabbix',passwd='xxxxx',port=3306,db='alert')
        cur = conn.cursor()
        cur.execute(sql)
        results = cur.fetchall()
        cur.close()
        conn.commit()
        conn.close()
    except MySQLdb.Error as e:
        mysqlerror = "Mysql Error %d: %s" % (e.args[0], e.args[1])
        logger.error(mysqlerror)
    return results

def sendmail(def_title, def_to, def_cc, def_body):
    mail_user = "xxxxxx@xxxx"
    mail_pass = "xxxxxx"
    sender = 'xxxxxx@xxxx'
    msg = MIMEText(def_body, 'plain', 'utf-8')
    msg['Subject'] = Header(def_title, 'utf-8')
    msg['To'] = ','.join(def_to)
    if def_cc:
        msg['CC'] = ','.join(def_cc)
    reciver = def_to + def_cc
    smtp = smtplib.SMTP()
    attempts = 0
    success = False
    while attempts < 3 and not success:
        try:
            smtp.connect('smtp.partner.outlook.cn')
            smtp.ehlo()
            smtp.starttls()
            smtp.ehlo()
            #smtp.set_debuglevel(1)
            smtp.login(mail_user, mail_pass)
            smtp.sendmail(sender, reciver, msg.as_string())
            smtp.quit()
            success = True
            logger.info("Send Mail Successful")
        except:
            attempts += 1
            logger.warn("Send Mail Failed, Retry")
            if attempts == 3:
                logger.error("Send Mail Failed For 3 Times")

def address(addbook):
    f = open("/usr/lib/zabbix/alertscripts/addresslist/" + addbook,"r")
    line = f.readline().strip()
    toandcc = line.split('##')
    mail_to = toandcc[0].split(',')
    mail_cc = toandcc[1].split(',')
    f.close()
    return(mail_to, mail_cc)

def main():
    results = mysql('select Time, Title, Value, count from alertsum')

    if results:
        for row in results:
            time = row[0]
            title = row[1]
            value = row[2]
            count = row[3]
            mail_title = title + " 检测到" + str(count) + "次 从:" + time
            mail_subject = value
            mail_to, mail_cc = address("ServerTeam")
            sendmail(mail_title, mail_to, mail_cc, mail_subject)
            logger.info("Title:" + mail_title + "\nTo:" + ",".join(mail_to) + "\nCC:" + ",".join(mail_cc) + "\n" + mail_subject )
            mysql('insert into passalert select * from nowalert')
            mysql('TRUNCATE TABLE nowalert')

if __name__ == "__main__":
    main()
chmod +x sendmail.py

然后加到crontab,15分钟执行一次

crontab –e

*/ * * * * root python /usr/lib/zabbix/alertscripts/sendmail.py >> /usr/lib/zabbix/alertscripts /maillog.log >&

5,测试

手动写入日志

echo error >> /root/log.txt

打3次

echo anothererror >> /root/log.txt

打5次

在zabbix页面上看到报警触发后登入mysql

数据已经写入至nowalert

select * from nowalert;

略

 rows in set (0.00 sec)

视图alertsum已经更新

select * from alertsum;

略

 rows in set (0.00 sec)

手动执行送信脚本或者等crontab触发后会收到如下2封邮件

再次登入mysql查看数据表nowalert,发现已经被清空,数据已经移动至passalert表

mysql> select * from nowalert;

Empty set (0.00 sec)

记录到的日志大概是这个样子的

2016-12-06 17:05:58,038: 14492 INFO Send Mail Successful
2016-12-06 17:05:58,038: 14492 INFO Title:<test>故障:Zabbix serverlogerr 检测到x次从:2016-12-06 17:05:00
To:xxxxx
CC:yyyyy

邮件内容xxxxxxxxxxx

送信出错时还会响应的记录以下日志

2016-12-06 16:38:53,669: 14182 WARNING Send Mail Failed, Retry
2016-12-06 16:38:58,687: 14182 WARNING Send Mail Failed, Retry
2016-12-06 16:39:03,719: 14182 WARNING Send Mail Failed, Retry
2016-12-06 16:39:03,720: 14182 ERROR Send Mail Failed For 3 Time
6,接下去要解决的课题

多个log监视同时大量写入时的状况未经测试,不知道脚本是否能够承受住。

Zabbix日志监视的汇总报警(更新发送邮件脚本)的更多相关文章

  1. Zabbix日志错误总结(持续更新)

    no active checks on server [*.*.*.*:10051]: host [*] not found failed to accept an incoming connecti ...

  2. zabbix使用之打造邮件报警

    zabbix使用之打造邮件报警 前言: 报警信息很重要,它能使我们最快的知道故障内容,以便于及时处理问题.zabbix如果没配置报警功能,则完全不能体现zabbix的优势了 配置详情如下: 1.编写发 ...

  3. Asp.Net Core 轻松学-利用日志监视进行服务遥测

    前言     在 Net Core 2.2 中,官方文档表示,对 EventListener 这个日志监视类的内容进行了扩充,同时赋予了跟踪 CoreCLR 事件的权限:通过跟踪 CoreCLR 事件 ...

  4. linux下日志文件error监控报警脚本分享

    即对日志文件中的error进行监控,当日志文件中出现error关键字时,即可报警!(grep -i error 不区分大小写进行搜索"error"关键字,但是会将包含error大小 ...

  5. 使用jenkins中遇到的问题汇总/持续更新

    jenkins产生大量日志文件 question: [DNSQuestion@1446063419 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN in ...

  6. zabbix学习笔记:zabbix监控之短信报警

    zabbix学习笔记:zabbix监控之短信报警 zabbix的报警方式有多种,除了常见的邮件报警外,特殊情况下还需要设置短信报警和微信报警等额外方式.本篇文章向大家介绍短信报警. 短信报警设置 短信 ...

  7. KbmMW资源汇总(更新中…)

    KbmMW框架是收费的,不在此提供下载,如需购买,请自行联系作者Kim Madsen. 网址资源: 官网主页:http://www.components4programmers.com/product ...

  8. 《WCF技术剖析》博文系列汇总[持续更新中]

    原文:<WCF技术剖析>博文系列汇总[持续更新中] 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖 ...

  9. Ubuntu16.04 + Zabbix 3.4.7 邮件报警设置

    部署了Zabbix,需要配置邮件报警,在网上找了一些教程,大多是是用的CentOS + Zabbix 2.x版本的,而且还要写脚本,感觉太麻烦了,所以自己结合其他文章摸索了一套配置方法. 先说一下环境 ...

随机推荐

  1. 用grunt进行前端工程化之路

    我们的项目wecash4.0的前端构建考虑过用fis和grunt. 目录: 前期调研:fis vs grunt vs gulp? 一.安装grunt和项目. fis是百度fex研发的构建工具,非常方便 ...

  2. github中cesium-terrain-builder和cesium-terrain-server使用

    cesium-terrain-builder的使用: 这个是用来把含有高程数据的tif图片切片成.terrain的小文件,是给cesium-terrain-server提供服务的. cesium-te ...

  3. 第九章 springboot + mybatis + 多数据源 (AOP实现)(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5415896.html 1.ShopDao package com.xxx.firstboot.dao; imp ...

  4. Ceph剖析:数据分布之CRUSH算法与一致性Hash

    作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...

  5. 关于移动端input框 在微信中 和ios中无法输入文字的问题

    这个是一个提交的页面但是总是无法输入进去文字 在uc中是可以的 但是在微信中 或者ios自带浏览器是无法输入的  绞尽脑汁  找了半天  才发现自己多加了一段代码(这个代码是模版中自带的   我靠) ...

  6. javascript面向对象(三)

    主要内容: 利用原型链的方式实现继承: 原型继承的特点:即继承了父类的模板,也继承了父类的原型对象. 类继承:只继承模板(借用构造函数的方式继承). 利用call.apply方法实现: 混合继承: 扩 ...

  7. db2设置共享内存

    db2 UPDATE DBM CFG USING INSTANCE_MEMORY 5242880 IMMEDIATEdb2 UPDATE DBM CFG USING INSTANCE_MEMORY A ...

  8. SharePoint 2013开发入门探索(二)- 列表操作

    我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其 ...

  9. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  10. AVL-tree

    //avl.h#ifndef __AVL_H__#define __AVL_H__ typedef int KEY_TYPE; /* struct */typedef struct AVL{ KEY_ ...