监控代码python

使用MySQLdb这个驱动,直接操作数据库,主要就是查询操作。

获取数据库的连接:

?12345678 def get_con():  host = "127.0.0.1" port = 3306 logsdb = "logsdb" user = "root" password = "never tell you" con = MySQLdb.connect(host=host, user=user, passwd=password, db=logsdb, port=port, charset="utf8")  return con 

首先 :从codego.net日志库里获取数据,获取当前时间之前2分钟的数据,首先,根据当前时间进行计算一下时间。之前,计算有问题,现在已经修改。

 

?12345 def calculate_time():     now = time.mktime(datetime.now().timetuple())-60*2 result = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))  return result 


然后:根据时间和日志级别去日志库查询数据

?1234567891011121314151617 def get_data():  select_time = calculate_time()  logger.info("select time:"+select_time)  sql = "select file_name,message from logsdb.app_logs_record " \    "where log_time >"+"'"+select_time+"'" \    "and level="+"'ERROR'" \    "order by log_time desc" conn = get_con()     cursor = conn.cursor()  cursor.execute(sql)  results = cursor.fetchall()     cursor.close()  conn.close()     return results 

在发送邮件的时候,使用python发送邮件比较简单,使用标准库smtplib就可以

这里使用163邮箱进行发送,你可以使用其他邮箱或者企业邮箱都行,不过host和port要设置正确。

?123456789101112131415161718 def send_email(content):    sender = "sender_monitor@163.com"receiver = ["rec01@163.com", "rec02@163.com"] host = 'smtp.163.com'port = 465msg = MIMEText(content) msg['From'] = "sender_monitor@163.com"msg['To'] = "rec01@163.com,rec02@163.com"msg['Subject'] = "system error warning"   try: smtp = smtplib.SMTP_SSL(host, port) smtp.login(sender, '123456') smtp.sendmail(sender, receiver, msg.as_string()) logger.info("send email success") except Exception, e: logger.error(e) 

定时任务这个部分使用一个单独的线程,每2分钟扫描一次,如果ERROR级别的日志条数超过5条,就发邮件通知。

?123456789101112 def task(): while True: logger.info("monitor running")    results = get_data() if results is not None and len(results) > 5: content = "recharge error:"logger.info("a lot of error,so send mail") for r in results: content += r[1]+'\n'send_email(content) sleep(2*60) 


日志里面我们为这个小小的脚本配置一下日志log.py,让日志可以输出到文件和控制台中。


?123456789101112131415161718 # coding=utf-8 import logging    logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG)    fh = logging.FileHandler('monitor.log') fh.setLevel(logging.INFO)    ch = logging.StreamHandler() ch.setLevel(logging.INFO)    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter)    logger.addHandler(fh) logger.addHandler(ch) 


来看一下app_monitor.py

?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 # coding=utf-8 import threading import MySQLdb from datetime import datetime import time import smtplib from email.mime.text import MIMEText from log import logger       def get_con():  host = "127.0.0.1" port = 3306 logsdb = "logsdb" user = "root" password = "never tell you" con = MySQLdb.connect(host=host, user=user, passwd=password, db=logsdb, port=port, charset="utf8")  return con       def calculate_time():     now = time.mktime(datetime.now().timetuple())-60*2 result = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))  return result       def get_data():  select_time = calculate_time()  logger.info("select time:"+select_time)  sql = "select file_name,message from logsdb.app_logs_record " \    "where log_time >"+"'"+select_time+"'" \    "and level="+"'ERROR'" \    "order by log_time desc" conn = get_con()     cursor = conn.cursor()  cursor.execute(sql)  results = cursor.fetchall()     cursor.close()  conn.close()     return results       def send_email(content):     sender = "sender_monitor@163.com" receiver = ["rec01@163.com", "rec02@163.com"]  host = 'smtp.163.com' port = 465 msg = MIMEText(content)  msg['From'] = "sender_monitor@163.com" msg['To'] = "rec01@163.com,rec02@163.com" msg['Subject'] = "system error warning"    try:   smtp = smtplib.SMTP_SSL(host, port)   smtp.login(sender, '123456')   smtp.sendmail(sender, receiver, msg.as_string())   logger.info("send email success")  except Exception, e:   logger.error(e)       def task():  while True:   logger.info("monitor running")   results = get_data()   if results is not None and len(results) > 5:    content = "recharge error:"   logger.info("a lot of error,so send mail")    for r in results:     content += r[1]+'\n'   send_email(content)   time.sleep(2*60)       def run_monitor():  monitor = threading.Thread(target=task)  monitor.start()       if __name__ == "__main__":  run_monitor() 


运行脚本测试,有点小激动.脚本在服务器上运行,使用supervisor进行管理。

在服务器(centos6)上安装supervisor,然后在/etc/supervisor.conf中加入一下配置:


[program:app-monitor]

command = python /root/monitor/app_monitor.py

directory = /root/monitor

user = root

然后在终端中运行supervisord启动supervisor。

在终端中运行supervisorctl,进入shell,运行status查看脚本的运行状态。

我们在里面测试这段实用的python监控代码,完全可以使用.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30007969/viewspace-1480976/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30007969/viewspace-1480976/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值