zoukankan      html  css  js  c++  java
  • python实时处理log文件脚本

    这个Python脚本是用来对实时文件的内容监控,比如 Error 或者 time out 字段都可以进行自定义;算是我的第一个真正的Python脚本,自己感觉还是比较臃肿,不过打算放到blog上记录一下(还是初学者,大神们勿喷哈),真心希望博友们能够再指点一下(现在记录每次的文件大小值是输出到了一个文件中,并且里面还嵌套了有shell命令,这些我认为都是可以优化掉的吧,只是现在我还不知道怎么做);告警是基于zabbix,自定义的模板是120s执行一次
    #!/usr/local/bin/python3.5
    ###Destription: 实时读取log信息
    ###Author:      Danny Deng
    ###Datetime:    2016-11-17
    import re,time,subprocess,os,linecache
    ###############定义log文件
    file_name = "/var/log/mongodb/mongodb.log"
    file_number = "/usr/local/zabbix_agent/number.txt"
    j = int(0)
    seek = int(0)
    ###############判断文件是否存在---判断number是否存在---判断number size 与 filesize
    ###############定义一个函数,遍历文件
    def readline():
    ###############if判断 seek是否大于0,大于则赋值,否则初始为0
        while True:
    ###############定义文件,根据seek值进行每行读取,每次tell赋值给seek
            with open(file_name,'r') as f:
                global seek
                #seek = seek
                f.seek(seek)
                data = f.readline()
                if  data:
                    seek = f.tell()
                    yield data
                else:
    ###############Python变量转换为shell变量
                    global file_number
                    os.environ['seek'] = str(seek)
                    os.environ['file_number'] = str(file_number)
    ###############记录上一次执行后的seek值,下次执行直接读取
                    os.system('echo $seek > $file_number')
                    os.system('chown zabbix.zabbix $file_number')
                    return
    ###############定义函数,find特定字符串从每行数据中
    def func_for():
        j = int(0)
        for i in readline():
            f_find = re.findall(r"error", i,flags=re.IGNORECASE)
            if "error" in f_find:
                j += 1
    ###############没有输出0,有值输出出现error匹配到的次数值
        try:
            print(j)
        except NameError:
            print(int("0"))
    ###############判断文件是否存在
    if os.path.isfile(file_name):
    ###############判断存储seek的文件是否存在
        if os.path.isfile(file_number):
    ###############存在时,读取其seek值
            seek_number = int(linecache.getline(file_number, 1))
    ###############如果有值判断seek值与现在文件大小值,大于说明log文件已重新生成,重置seek值为0
            if os.path.getsize(file_name) >= seek_number and seek_number > 0:
                seek = seek_number
                func_for()
            else:
                seek = int(0)
                func_for()
    ###############如果存储seek值的文件不存在,新建并出示seek值为0
        else:
            os.environ['file_number'] = str(file_number)
            os.system('echo 0 > $file_number')
            os.system('chown zabbix.zabbix $file_number')
            func_for()
    ###############文件不存在 报错
    else:
        print("Error")
        quit()
    

      

     
  • 相关阅读:
    Linux网络编程系列-TCP传输控制
    Lucene系列-索引文件
    python Web开发框架-Django (1)
    安卓课本例子-01-使用XML布局文件控制用户界面
    javaEE--数据库01
    安卓-08-布局管理器
    安卓-07-开发自定义的View--实践-跟随手指移动的小兔子
    安卓-06-使用XML和Java设置UI--实例--03--QQ相册
    安卓-05-使用Java设置UI--实验02-使用Java实现UI设置
    安卓-04-实例01-XML布局UI界面
  • 原文地址:https://www.cnblogs.com/anita-harbour/p/9297741.html
Copyright © 2011-2022 走看看