博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日志文件报警监控脚本(可用于zabbix监控文件)测试中...
阅读量:7021 次
发布时间:2019-06-28

本文共 3649 字,大约阅读时间需要 12 分钟。

因业务要求,需要对某些日志文件中出现的关键字进行监控,所以写了个脚本用于直接用zabbix调用并返回超出阈值的监控项。

主要用来替代zabbix自带的文件监控项。可以对一台机器上的多个日志文件,多个触发阈值进行监控。不用配置多条zabbix监控项及触发器。

也许将来会逐步增加其他奇怪的监控内容

脚本代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# Author: ColinShiimport sys, osimport datetimeimport timeimport reclass Log_File_Check(object):    def __init__(self, filename, error_dict):        self.filename = filename        self.tmpfilename = '/tmp/'+self.filename.replace('/', '') + '_st_size.tmp'        self.error_dict = error_dict        self.res = {}    def check_st_size(self):        if os.path.exists(self.tmpfilename):            with open(self.tmpfilename, 'r') as f:                pre_size = f.read()                pre_size.replace('\n', '')                pre_size = int(pre_size)            if self.st_size < pre_size:                return 0            else:                return self.st_size        else:            return 0    def write_st_size(self):        with open(self.tmpfilename, 'w') as f:            f.write(str(self.st_size))    def check_content(self):        if not os.path.exists(self.filename):            return        with open(self.filename, 'r') as file:            st_results = os.stat(self.filename)            self.st_size = st_results[6]            pre_size = self.check_st_size()            file.seek(pre_size)            content = file.read()            content = content.replace('\n', '')        for i in self.error_dict:            pattern = re.compile(i[0])            pattern.fullmatch()            if int(i[1]) <= len(pattern.findall(content)):                if self.res.get(self.filename):                    self.res[self.filename].append(i[0])                else:                    self.res[self.filename] = []                    self.res[self.filename].append(i[0])        self.write_st_size()        return self.res    def start_check(self):        return self.check_content()def do_error_dict(filename):    tmpdic = {}    with open(os.path.dirname(os.path.realpath(sys.argv[0])) + '/' + filename, 'r') as f:        for i in f.readlines():            i = i.replace('\n', '')            i = i.split('||')            if len(i) == 4:                i[0] = random_time(i[0], i[-1], '')            elif len(i) == 5:                i[0] = random_time(i[0], i[-2], i[-1])            if i[0] in tmpdic.keys():                tmpdic[i[0]].append([i[1], i[2]])            else:                tmpdic[i[0]] = []                tmpdic[i[0]].append([i[1], i[2]])    return tmpdicdef random_time(filename, date_time, ex_name):    now_time = datetime.datetime.now().strftime(date_time)    return filename + now_time + ex_nameif __name__ == '__main__':    '''    接收1个参数:    参数一必选参数:需要监控的日志文件的list    '''    result = []    file = sys.argv[1]  # r"/tmp/logdir/odp_locic/log/rpc/rpc-request.log.wf."    for k, v in do_error_dict(file).items():        log_check = Log_File_Check(k, v)        f = log_check.start_check()        if f:            result.append(f)    if result == []:        print 'ok'    else:        print 'Threshold exceeded:', result  

  配置文件格式(前三个为必填参数,后两个为可选,可以同时监控多个日志文件,或者多条触发阈值报警):

一般使用: 被监控文件名称||
需要匹配行的正则表达式||阈值次数
示例:
/logdir/odp_locic/log/order/order.log||^(.*)retry=0/0(.*)MQ_EXECUTE_FAILED(.*)$||10
特殊用法: 文件名前缀(或者文件全名)||需要匹配行的正则表达式||阈值次数||文件特殊格式(日期时间归档)||文件后缀 示例: /logdir/odp_locic/log/order/order.||^(.*)retry=0/0(.*)MQ_EXECUTE_FAILED(.*)$||10||%Y%m%d%H||.log

 示例实际读取的文件为

/logdir/odp_locic/log/order/order.{当前日期小时}.log文件

 

备注:

这个脚本需要传入一个参数,为配置文件名称(配置文件需要和运行脚本放置在同一目录下)

该脚本只适用于linux操作系统,并且会在/tmp目录下生成相应的临时文件(日志路径+文件名_st_size.tmp),用于记录上次日志采集位置。

返回ok表示未触发阈值

返回其他表示相应的日志文件,正则表达式被触发。

转载于:https://www.cnblogs.com/colinshi/p/10364657.html

你可能感兴趣的文章
第十二章:window对象
查看>>
《构建之法》第一章读后随笔
查看>>
修改ESMAP中的LOGO
查看>>
多线程中lock的使用
查看>>
课堂记录
查看>>
ASN.1 バイナリ変換規則 (BER) (転載)
查看>>
BZOJ4415:[SHOI2013]发牌(线段树)
查看>>
团队作业(六)
查看>>
asp.net mvc多级目录结构和多级area实现技巧
查看>>
javascript 二
查看>>
【转】Tomcat+JSP:运行时出现The requested resource is not available...
查看>>
小米open-falcon监控系统接入手册
查看>>
java for循环里面执行sql语句操作,有效结果只有一次,只执行了一次sql mybatis 循环执行update生效一次 实际只执行一次...
查看>>
db连接驱动
查看>>
IOS FoundationKit (NSString) 知识汇总
查看>>
SQL2005查询死锁的表和具体的语句
查看>>
动名词和不定式
查看>>
centos6.5环境Redis下载及编译安装
查看>>
python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作...
查看>>
form表单
查看>>