1. 程式人生 > >日誌文件報警監控腳本(可用於zabbix監控文件)測試中...

日誌文件報警監控腳本(可用於zabbix監控文件)測試中...

self 監控項 erro fin 備註 exe 配置文件 並且 不用

因業務要求,需要對某些日誌文件中出現的關鍵字進行監控,所以寫了個腳本用於直接用zabbix調用並返回超出閾值的監控項。

主要用來替代zabbix自帶的文件監控項。可以對一臺機器上的多個日誌文件,多個觸發閾值進行監控。不用配置多條zabbix監控項及觸發器。

也許將來會逐步增加其他奇怪的監控內容

腳本代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: ColinShi

import sys, os
import datetime
import time
import re


class 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 tmpdic


def random_time(filename, date_time, ex_name):
    now_time = datetime.datetime.now().strftime(date_time)
    return filename + now_time + ex_name


if __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表示未觸發閾值

返回其他表示相應的日誌文件,正則表達式被觸發。

日誌文件報警監控腳本(可用於zabbix監控文件)測試中...