基于Python 的关键字监控及告警

为了解决日志文件监控的问题, 使用python脚本完成了基于关键字的告警功能

环境 python 2.7

依赖包 time \ traceback \ filelock \ logging

代码如下:

#!/bin/python
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
import re
import os
from urllib import urlencode
import logging
import filelock
import time
import traceback

#config.conf
#文件1:关键字A|关键字B:出现次数:告警方式:联系方式:联系组:某某异常
#文件2:关键字C|关键字D:出现次数:告警方式:联系方式:联系组:某某异常

#rc.local增加
#sudo -u monitor /bin/bash -x /home/apps/logmon-job/deploy_py.sh

logging.basicConfig(level=logging.DEBUG,
                    format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
                    datefmt=‘%a, %d %b %Y %H:%M:%S‘,
                    filename=‘/home/logs/monitor/logmon.log‘,
                    #filename=‘/Users/mac/Desktop/logmon/logmon.log‘,
                    filemode=‘a‘)

basDir=‘/home/apps/logmon-job/‘

posFiles=basDir+‘/pos.log‘
configFile=basDir+‘config.conf‘

def readOnly(filename):
    return open(filename,‘r‘)
    # pass

def readWrite(filename):
    return open(filename,‘rw‘)
    # pass
def writeOnly(filename):
    return open(filename,‘w‘)
    # pass

# def closesfile():
#     pass

def getStartPosLog(posFiles):
    txt=readOnly(posFiles)
    result={}
    for i in txt :
        filename,pos=i.split(‘:‘)
        if filename != ‘‘ :
            result[filename]=pos
    return result
    txt.close()

def rematch(txt,regular):
    resultList=[]
    for t in txt.split(r‘\n‘) :
        # print t
        # pattern = re.compile(r‘:‘)
        pattern = re.compile(regular)

        resultList=(pattern.findall(t))
    try :
        # print ‘匹配结果为‘,resultList
        return len(resultList),regular , resultList[0]
    except Exception as e :
        print e
        return 0 , regular , ‘‘
    # pass

def getEndPost(f):
    filename=readOnly(f)
    try :
        nowpos=filename.tell()
        filename.seek(0,2)
        endpos=filename.tell()
        filename.seek(nowpos,0)
    except :
        endpos = 0
    filename.close()
    return endpos
    # pass

def getDistinct(startpos,endpos):
    return endpos-startpos

def getText(f,startpos,endpos):

    filename=readOnly(f)
    filename.seek(startpos,0)
    textLength=getDistinct(startpos,endpos)
    text=filename.read(textLength)
    filename.close()
    return text

def updatePosLog(posResult,posFiles):
    f=writeOnly(posFiles)
    # print ‘posResult ‘,posResult
    for k in posResult.keys() :
        v=posResult[k]
        f.writelines(‘%s:%s\n‘ %(k,v))
    f.close()

    pass

def getAlterConfi(filename):
    #文件:关键字:出现次数:告警方式:联系方式:联系组
    f=readOnly(filename)
    result={}
    for lines in f.readlines():
        # print lines
        try :
            filename , key , count , alterType , alterAddress , alterGroup ,alterMessage= lines.strip(‘\n‘).split(":")
            result[filename]={}
            result[filename]["key"]         =key
            result[filename]["count"]       =count
            result[filename]["alterType"]   =alterType
            result[filename]["alterAddress"]=alterAddress
            result[filename]["alterGroup"]  =alterGroup
            result[filename]["alterMessage"]=alterMessage
        except Exception as e:
            print e
            print ‘错误的配置 %s‘ % (lines.strip(‘\n‘))
            pass
    return result

def sendSms(account,message):

    data={
        ‘accounts‘:account  ,
        ‘templateName‘:‘opalert‘ ,
        ‘alertcontent‘:message ,
    }
    encodeMessage=urlencode(data)

    #正式时需要开启
    os.system(‘curl -I "http://10.1.1.146:8080/sms/send?%s" ‘ % ( encodeMessage ) )

def main():
    global posFiles
    global configFile

    AlterConfi=getAlterConfi(configFile)
    print AlterConfi
    posResult=getStartPosLog(posFiles)
    posResult_bak=getStartPosLog(posFiles)
    # print posResult
    for filename in AlterConfi.keys() :
        keyDict=AlterConfi[filename]
        print ‘开始检查文件 ‘,filename
        #print  rematch(filename,r‘#‘)[0]
        if not os.path.exists(filename):
            print ‘file "%s" not exist ,pass‘ % (filename)
            # continue
        if os.path.exists(filename):

            endpos  = getEndPost(filename)

            if endpos == 0 :
                print ‘file "%s" is empty ,pass‘ % (filename)
            else :
                try :
                    startpos=  int(posResult[filename])
                except :
                    startpos = 0
                print ‘startpos is %.f , endpos is %.f‘ %(startpos ,endpos)

                #处理切割后,偏移量归位
                if startpos > endpos :
                    startpos = 0

                text = getText(filename,startpos,endpos)
                # print ‘%s text is  : ‘%(filename) , text

                #分析关键字
                #print AposlterConfi[filename]
                matchCount , regular , resultList = rematch(text,keyDict[‘key‘])
                print ‘匹配关键字‘,regular , ‘匹配长度为‘, matchCount , ‘关键字告警阈值‘ ,keyDict[‘count‘] , ‘关键字‘ , resultList

                if int(matchCount) >= int(keyDict[‘count‘]) :
                    print ‘alterGroup len is ‘,len(keyDict[‘alterGroup‘])
                    print ‘alterType len is ‘ ,len(keyDict[‘alterType‘])
                    if len(keyDict[‘alterGroup‘]) > 0:
                        pass
                    if len(keyDict[‘alterType‘]) >0:
                        if keyDict[‘alterType‘].upper() == ‘SMS‘ :
                            for account in keyDict[‘alterAddress‘].split(‘,‘) :
                                if len(account) >0 :
                                    sendSms(account,‘发现%s 告警,关键字:%s  ,出现次数:%s ‘ %(keyDict[‘alterMessage‘] , resultList , matchCount ))
                        pass
                #记录末尾偏移量
                posResult_bak[filename]=endpos

    print ‘打印文件偏移量信息‘,posResult_bak

    #正式时需要开启
    updatePosLog(posResult_bak,posFiles)

if __name__ == ‘__main__‘:
    lock = filelock.FileLock("/home/apps/logmon-job/logmon.py.lock")
    if lock:
        logging.info("CaiWeiCheng Get Lock.start!!!")
    try:
        with lock.acquire(timeout=5):
            while 1 :
                main()
                time.sleep(60)
            # pass
    #except filelock.timeout :
    except Exception as e :
        print traceback.format_exc()
        print "timeout"
        logging.warning("get file lock timeout")
时间: 2024-11-17 06:31:52

基于Python 的关键字监控及告警的相关文章

nomon+ pyNmonAnalyzer实现基于python的nmon监控性能数据可视化

pip install pyNmonAnalyzer nnmon  for linux from sourceforge:https://sourceforge.net/projects/nmon/ github project地址:https://github.com/madmaze/pyNmonAnalyzer readme: usage: pyNmonAnalyzer [-h] [-x] [-d] [--force] [-i INPUT_FILE] [-o OUTDIR] [-c] [-b

Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控

基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控   By: 授客 QQ:1033553122   1.测试环境 python 3.4 zookeeper-3.4.13.tar.gz 下载地址1: http://zookeeper.apache.org/releases.html#download https://www.apache.org/dyn/closer.cgi/zookeeper/ https://mirrors.tuna.tsinghua.edu

实战:基于Python构建运维自动化平台

导语: 今天与大家一起探讨如何基于Python构建一个可扩展的运维自动化平台,也希望能与大家一起交流,共同成长. 此次分享将通过介绍OMServer.OManager具备的功能.架构设计.模块定制.安全审计.C/S结构的实现等几个方面的内容来展开. 为什么选择Python? 默认安装且跨平台 可读性好且开发效率高 丰富的第三方库(开发框架.各类API.科学计算.GUI等) 社区活跃&众多开发者. Python在腾讯的现状,根据去年内部提交组件语言统计,除去2.3.4前端技术,Python在高级编

如何基于Python构建一个可扩展的运维自动化平台

嘉宾简介 刘天斯 从事互联网运维工作已13年,目前就职于腾讯-互动娱乐部,负责游戏大数据的运营,曾就职于天涯社区,担任首席架构师/系统管理员. 热衷开源技术的研究,包括系统架构.运维开发.负载均衡.缓存技术.数据库.NOSQL.分布式存储.消息中间件.大数据及云计算.Mesos.Docker.DevOps等领域.擅长大规模集群的运维工作,尤其在自动化运维方面有着非常丰富的经验.同时热衷于互联网前沿技术的研究,活跃在国内社区.业界技术大会,充当一名开源技术的传播与分享者. 导言 受 Reboot

基于Python+Django的Kubernetes集群管理平台

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/1345 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优势,但是随着业务的不断增长,以及服务的多元化,容器的体量与管理的难度也随之增长. 浅述Kubernetes集群日常管理维护中的一些痛点: 1.较为庞大的集群规模及容器数量维护管理

lite-monitor 一款基于shell命令的监控系统

介绍 lite-monitor 一款基于shell命令的监控系统,可以根据项目中输出的日志定时输出或者统计输出,并发送钉钉机器人报警消息. lite-monitor能做什么: 定时监控某个服务进程是否还存在,不存在则钉钉告警. 定时统计近一段时间内具体日志文件中关键字出现的次数,并对次数做一个阈值比较,超出阈值则钉钉告警并输出日志. 进阶监控(qps/计算效率等)可以根据awk等命令自定义实现. lite-monitor的特点: 每个监控可配置不同钉钉群机器人,可配置@具体人或者@all 对已有

Linux/Unix shell 监控Oracle告警日志(monitor alter log file)

使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linux 下使用 shell 脚本来监控 Oracle 告警日志(monitor alter log file). Linux Shell的相关参考:        Linux/Unix shell 脚本中调用SQL,RMAN脚本        Linux/Unix shell sql 之间传递变量   

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

基于ITIL的SCOM监控最佳实践

1.  按照系统类别进行监控 很多朋友在使用SCOM进行监控的时候,往往只是导入管理包,推送代理,并不会思考很多,那么在这种情况下,SCOM在进行监控的时候都是基于缺省的类对象进行监控,比如说Windows计算机,一次就只能以一台Windows计算机的维度去监控,点击一台Windows计算机,下面会是关于这台计算机的进一步信息,比如这台计算机上面的磁盘,CPU,内存,数据库状态. 但是,这种监视方式太狭隘了,而且不便于整体统计,如果企业有很多业务系统呢,每个业务系统下面有很多机器,当企业要统计业