python实现监控磁盘情况,并邮件报警

#coding:utf-8
import os
import re
import smtplib
import datetime
import shelve
from email.mime.text import MIMEText

# 硬盘使用率报警阀值
hd_usage_rate_threshold = 80

# 要发给谁
mailto_list=["******@17guagua.com","******@17guagua.com"]

# 设置服务器,用户名、口令以及邮箱的后缀
mail_host="smtp.17guagua.com"
mail_user="******@17guagua.com"
mail_pass="******"
mail_postfix="17guagua.com"

# 日志偏移
log_offset = shelve.open('log_offset')

# 取当天日期
log_path_suffix=(datetime.date.today()).strftime('%Y-%m-%d')

# 当前日期key
cur_time = 'cur_time'

# 日志路径
app_info = {}
app_info['event'] = ['/opt/log/guagua_web_event_extends/event-ext-'+log_path_suffix+'.log',['失败','异常'],[]]

# 处理日志
def analysis_log(appName ,appInfo):
    cur_time_val = get_shelve_value(cur_time)
    if cur_time_val == -1:
        set_shelve_value(cur_time, log_path_suffix)
    elif log_path_suffix != cur_time_val:
        set_shelve_value(appName, 0)
        set_shelve_value(cur_time, log_path_suffix)

    f1 = file(appInfo[0], "r")
    offset = get_shelve_value(appName)
    if offset != -1:
        f1.seek(offset,1)
    else:
        set_shelve_value(appName, 0)
    count = 0
    exceptionStr = ""
    for s in f1.readlines():
        searchKey = appInfo[1]
        if len(searchKey) > 0:
            for i in searchKey:
                li = re.findall(i, s)
                if len(li) > 0:
                    count = count + li.count(i)
                    exceptionStr = exceptionStr + " " + s
        else:
            li = re.findall('Exception', s)
            if len(li) > 0:
                count = count + li.count('Exception')
                exceptionStr = exceptionStr + " " + s
    set_shelve_value(appName, f1.tell())
    print appName + " 异常数量为 " + str(count)
    return [count, "---------------------------------" + appName + " ----------------------------- \n " + exceptionStr]

#shelve 处理
def set_shelve_value(key, value):
    log_offset[key] = value

def get_shelve_value(key):
    if log_offset.has_key(key):
        return log_offset[key]
    else:
        return -1

def del_shelve_value(key):
    if log_offset.has_key(key):
        del log_offset[key]

# 发送邮件
def send_mail(to_list,sub,content):
  me = mail_user + "<"+ mail_user + "@" + mail_postfix + ">"
  msg = MIMEText(content, 'html', 'utf-8')
  msg['Subject'] = sub
  msg['From'] = me
  msg['To'] = ";".join(to_list)
  try:
    s = smtplib.SMTP()
    s.connect(mail_host)
    s.login(mail_user,mail_pass)
    s.sendmail(me, to_list, msg.as_string())
    s.close()
    return True
  except Exception, e:
    print str(e)
    return False

# 获得外网ip
def get_wan_ip():
    cmd_get_ip = "/sbin/ifconfig |grep 'inet addr'|awk -F\: '{print $2}'|awk '{print $1}' | grep -v '^127' | grep -v '192'"
        get_ip_info = os.popen(cmd_get_ip).readline().strip()
    return get_ip_info

# 检测硬盘使用
def check_hd_use():
        cmd_get_hd_use = '/bin/df'
        try:
            fp = os.popen(cmd_get_hd_use)
        except:
            ErrorInfo = r'get_hd_use_error'
            print ErrorInfo
            return ErrorInfo
        re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)')
        hd_use = {}
        for line in fp:
            match = re_obj.search(line)
            if match is not None:
                hd_use[match.groupdict()['mount']] = match.groupdict()['used']
        fp.close()
        return  hd_use

# 硬盘使用报警
def hd_use_alarm():
    for v in check_hd_use().values():
    if int(v) > hd_usage_rate_threshold:
        if send_mail(mailto_list,
                 'System Disk Monitor',
             'nSystem Ip:%s\nSystem Disk Use:%s'
             % (get_wan_ip(),check_hd_use())):
             print  "sendmail success!!!!!"
    else:
         print "disk not mail"

if __name__ == '__main__':
  hd_use_alarm()
  exceptionCount = 0
  exceptionContents = "";
  for key in app_info:
    exceptionContent = analysis_log(key, app_info[key])
    exceptionCount += exceptionContent[0]
    exceptionContents += exceptionContent[1]
    exceptionContents = exceptionContents + "*********************************************** \n"

  print exceptionCount
  if exceptionCount > 0:
    if send_mail(mailto_list, get_wan_ip() + " 日志报警",exceptionContents):
        print "发送成功"
    else:
        print "发送失败"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Python的psutil库获取系统CPU、内存和磁盘空间的使用情况使用matplotlib库绘制折线图,使用smtplib库发送邮件报警。 以下是一个简单的示例代码: ```python import psutil import matplotlib.pyplot as plt import datetime import time import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮件报警 def send_email_alert(subject, content): mail_host = "smtp.xxx.com" # 邮箱服务器地址 mail_user = "your_email" # 邮箱账号 mail_pass = "your_password" # 邮箱密码 sender = 'your_email' # 发件人邮箱 receivers = ['receiver_email'] # 收件人邮箱列表 message = MIMEText(content, 'plain', 'utf-8') message['From'] = Header("System Monitor", 'utf-8') message['To'] = Header("Admin", 'utf-8') message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP_SSL(mail_host, 465) smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) smtpObj.quit() print("邮件发送成功") except smtplib.SMTPException as e: print("Error: 无法发送邮件") print(e) # 获取CPU、内存和磁盘空间使用情况 def get_system_info(): cpu_percent = psutil.cpu_percent() mem_percent = psutil.virtual_memory().percent disk_percent = psutil.disk_usage('/').percent return cpu_percent, mem_percent, disk_percent # 绘制折线图 def plot_line_chart(x, y, title, xlabel, ylabel): fig, ax = plt.subplots() ax.plot(x, y) ax.set(xlabel=xlabel, ylabel=ylabel, title=title) ax.grid() plt.show() # 监控近一年系统使用情况 def monitor_system(): # 初始化数据 cpu_data = [] mem_data = [] disk_data = [] time_data = [] # 监控近一年系统使用情况 for i in range(365): cpu_percent, mem_percent, disk_percent = get_system_info() cpu_data.append(cpu_percent) mem_data.append(mem_percent) disk_data.append(disk_percent) time_data.append(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) time.sleep(3600) # 每隔一个小时获取一次数据 # 绘制折线图 plot_line_chart(time_data, cpu_data, 'CPU Usage', 'Time', 'CPU Usage (%)') plot_line_chart(time_data, mem_data, 'Memory Usage', 'Time', 'Memory Usage (%)') plot_line_chart(time_data, disk_data, 'Disk Usage', 'Time', 'Disk Usage (%)') # 发送邮件报警 if max(cpu_data) >= 90: subject = 'CPU usage is too high!' content = 'The CPU usage is {}% at {}.'.format(max(cpu_data), time_data[cpu_data.index(max(cpu_data))]) send_email_alert(subject, content) if max(mem_data) >= 90: subject = 'Memory usage is too high!' content = 'The memory usage is {}% at {}.'.format(max(mem_data), time_data[mem_data.index(max(mem_data))]) send_email_alert(subject, content) if max(disk_data) >= 90: subject = 'Disk usage is too high!' content = 'The disk usage is {}% at {}.'.format(max(disk_data), time_data[disk_data.index(max(disk_data))]) send_email_alert(subject, content) if __name__ == '__main__': monitor_system() ``` 这个示例代码会每隔一个小时获取一次系统CPU、内存和磁盘空间的使用情况,并绘制近一年的折线图。如果某个指标的最大值超过90%,则会发送邮件报警。你需要将`your_email`和`your_password`替换成实际的邮箱账号和密码,将`mail_host`替换成实际的邮箱服务器地址,将`receiver_email`替换成实际的收件人邮箱

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值