Redis慢日志整理脚本

114 阅读1分钟
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import redis,time,sys
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header


RedisList = [
    {"IP": "192.168.10.27","port": 6379,"password": "********"},
    {"IP": "192.168.10.27","port": 6381,"password": "********"},
    {"IP": "192.168.10.28","port": 6379,"password": "********"},
    {"IP": "192.168.10.28","port": 6380,"password": "********"},
    {"IP": "192.168.10.29","port": 6380,"password": "********"},
    {"IP": "192.168.10.29","port": 6381,"password": "********"}
]

#标题
title="Redis慢日志分析结果"

#发送人
mail_host="smtp.mayi.com"
mail_user="server@mayi.com"
mail_pass="Mayi123456"
sender = 'server@mayi.com'

#收件人
To=['test1@mayi.com']
Cc=['test2@mayi.com']
reciver = To+Cc

#慢日志分析结果
style_time = time.strftime("%Y-%m-%d-%H-%M", time.localtime(int(time.time())))
log_name = "/tmp/redis_slow_log_parse_{0}.log".format(style_time)

def timestamp_datetime(value):
    format = '%Y-%m-%d %H:%M:%S'
    value = time.localtime(value)
    dt = time.strftime(format, value)
    return dt

def get_slow_log(host,port,password):
    pool = redis.ConnectionPool(host=host, port=port,password=password)
    conn = redis.StrictRedis(connection_pool=pool)

    #获取100行慢日志
    slowlog = conn.slowlog_get(100)

    #将Redis慢日志写入文件
    f = open(log_name, 'a+')
    for line in slowlog:
        duration = line['duration']/1000
        start_time = timestamp_datetime(line['start_time'])
        command = line['command'].split()[0:2]
        f.write('[{0}] {1}:{2} Command: {3} Exec_time: {4}ms\n'.format(start_time,host,port,command,duration))

    f.close()

    #清理慢日志
    conn.slowlog_reset()


def sendmail():
    message = MIMEMultipart()
    message["Subject"] = Header(title, "utf-8")  # 标题
    #收件人
    message['To'] = ",".join(To)
    message['Cc'] = ','.join(Cc)

    # 邮件正文
    context='Redis慢日志分析结果如下,请各位研发同学关注.'
    with open(log_name,"r") as file:
        for line in file.readlines():
            context= context + "</br>"+line.strip('\n')
    message.attach(payload=MIMEText(_text=context, _subtype="html", _charset="utf-8"))

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)
        smtpObj.login(mail_user,mail_pass)
        smtpObj.sendmail(sender, reciver, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")


if __name__ == '__main__':
    for list in RedisList:
        get_slow_log(list["IP"],list["port"],list["password"])
    #将分析结果发送邮件
    sendmail()