抓取项目日志

2020-04-20  本文已影响0人  Canon_2020
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Date    : 2018-10-16 09:00:00
# @Author  : Canon
# @Link    : https://www.python.org
# @Version : 3.6.5

"""
抓取项目日志进行报警
"""

import os
import re
import socket
import time


# 定义日志匹配函数
def Log_re(mode,data):
    # 根据传递过来的模式及内网,过滤出相应的内容
    m = re.findall(mode,data, re.I|re.M)
    if m:
        # 将正则匹配得到的数组,以html的换行符"<br/>"作为分割符,连接成字符串
        return m 
    else:
        return ''


# 获取服务器信息
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
year = time.strftime('%Y')
date = time.strftime('%Y-%m-%d %H:%M')


# 定义日志检查函数
def check_log(log_path):
    """
    检查日志是否报错, 例: check_log("/home/tomcat/PG/logs/")
    :param log_path: 日志目录路径, 注意加上最后一个"/"
    """
    # 遍历给定路径下的文件及子目录
    for root, dirs, files in os.walk(log_path, topdown=False):
        # 根据给定的不同路径分割出不同的项目名称
        if "/home/tomcat" in root:
            t = os.path.split(root)[0]
            t2 = os.path.split(t)[0]
            dirname = os.path.split(t2)[1]
        else:
            t = os.path.split(root)[0]
            dirname = os.path.split(t)[1]
        # 循环给定目录下的文件
        for name in files:
            # 定义存放日志读取位置的文件
            pos_file = "logcheck/{0}-{1}.line".format(dirname,name)
            # 定义用于抓取匹配的文件名
            file_name = os.path.join(root, name)
            # 判断文件名是否符合相应的条件
            if ( os.path.splitext(file_name)[1] == ".log" or os.path.splitext(file_name)[1] == ".out" ) and year not in os.path.splitext(file_name)[0]:
                with open(file_name,'r') as log_file:
                    if os.path.exists(pos_file):
                        with open(pos_file,'r') as lf:
                            # 从 pos_file 中读取日志位置信息
                            start_pos=lf.read()
                            start_pos=int(start_pos)
                            # 将日志文件的读取光标定位到文件末尾并将位置信息记录为 end_pos
                            log_file.seek(0,2)
                            end_pos=log_file.tell()
                    else:
                        log_file.seek(0,2)
                        end_pos=log_file.tell()
                        start_pos=log_file.tell()
                    # 当结束位置大于开始位置时,执行日志匹配
                    if end_pos > start_pos:
                        # 将日志文件的读取光标移动到 start_post 的位置开始读取
                        log_file.seek(start_pos,0)
                        log_content=log_file.read()
                        pattern = ".*exception.*\s|.*error.*\s"
                        content=Log_re(pattern, log_content)
                        # 如果匹配内容不为空,则发送报警邮件
                        if content:
                            Error_nums=len(content)
                            result='<br/>'.join(content)
                            # subject="%s-%s ERROR:%s have errors." % (hostname,ip,file_name)
                            subject="{0} Alert in MIRROR! {1} have {2} errors in the last 10 minutes.".format(date,file_name,Error_nums)
                            # print(subject)
                            # 定义收件人
                            to=["ron@oceanpayment.com.cn","lomo@oceanpayment.com.cn","dick@oceanpayment.com.cn","carol@oceanpayment.com.cn","canon@oceanpayment.com.cn"]
                            # Send_email(subject,result,to)
                            print(result)
                    else:
                        pass
                    # 保存日志匹配的结束位置到pos_file
                    with open(pos_file,'w') as lf:
                        lf.write(str(end_pos))


# check_log("/usr/local/logs/AdminSystem/")
# check_log("/home/tomcat/AS/logs/")

上一篇下一篇

猜你喜欢

热点阅读