设为首页 收藏本站
查看: 840|回复: 0

[经验分享] 实用python监控代码

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-2 08:37:43 | 显示全部楼层 |阅读模式
使用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
首先 :从日志库里获取数据,获取当前时间之前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查看脚本的运行状态。
我们在codego.net里面测试这段实用的python监控代码,完全可以使用.


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-53025-1-1.html 上篇帖子: python 扫描内网存活主机 下篇帖子: python连接中控考勤机分析数据 python 监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表