开发老大周五叫我过去提需求,我崩溃了:scream:
临近周五,心情那是一个美滋滋。结果下午开发老大就来找我了,叫我去他工位一趟,我心想:‘凉凉,这估计是来需求了'
果然,需求是这样的:
现在有个系统因为某种原因会导致数据库磁盘数据占满的情况,然后导致数据不能再存储的情况,最后导致系统
崩溃。之前已经发生过这种情况,所以老大写了一个监控job,定时去查询数据库存储是否满,满了就停止系统
提供服务,就是所谓的关闭服务。
但是这样并不能完全解决问题,只是把系统服务停了。老大的意思让我时不时去查看一下数据库的储存情况,如
果占据储存马上要满了,就通知他。
我直接当场就反驳:anguished::“这不能写个脚本看吗,看到磁盘使用率超过多少的时候,发送邮件?”
开发老大:“机器都是内网的,因为安全因素,不能联网”
我想:sob::“那就麻烦了啊”
开发老大:“就差不多这样!”
回到工位,我开始思考起来,“好歹是个程序员,这点监控还有自己手动去看吗?”。由于内网无法发邮件,但是
我们能通过xshell连接过去啊,虽然连接的ip并不是真的主机地址(连接的ip做了代理转换,转到了真正的机
器)我不管中间怎么转换的,只要我们能连接xshell,就能本地监控呗!于是我想到了Python来实现这个功能
具体思路
部署一个python脚本在内网机器上,这个内网机器必须跟之前的链接xshell的机器在一个内网上,设置为开机自
动启动,那python脚本的功能是什么,且听我细细道来:负责做一个定时任务,比如每天间隔2小时,ssh连接
到机器后,执行df -hl命令查看磁盘空间,如果磁盘空间使用率大于95%时,往收件人发送邮件。
实现
由于我从来没接触过python,但有着其他语言的基础加上现在gpt的优势,还是挺轻松的搞定了。
第一步就是安装python环境了,就像java安装JDK一样。简单就不写了
第二步得安装库,在python系统库中,并没有负责ssh连接和定时任务,所以需要引入库
pip install paramiko schedule
第三步就是写代码了:sob::sob:,这是最麻烦的啦,在一步一步调式之后,终于写好了。
import schedule
import time
import smtplib
import email.utils
from email.mime.text import MIMEText
import paramiko
import logging
from logging import handlers
logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# 控制台日志
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
# 文件日志
file_handler = handlers.TimedRotatingFileHandler(filename='monitor.log', when='D')
file_handler.setFormatter(formatter)
logger.setLevel(level=logging.INFO)
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
ip = ''
username = ''
password = ''
monitor_location = ""
from_addr = ""
# 授权码
email_password = ""
to_addrs = [""]
# smtp服务器地址
smtp_server = "smtp.qq.com"
# smtp服务器端口
smtp_port = 465
# 邮件标题
subject = "磁盘使用警告"
# 间隔查询时间
sleep_time = 1
def job():
ssh = paramiko.SSHClient()
# 自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, username=username, password=password)
stdin, stdout, stderr = ssh.exec_command('df -hl')
lines = stdout.readlines()
logger.info(lines)
for line in lines:
logger.info(line)
if monitor_location in line:
userage = int(line.split()[4].strip('%'))
if userage > 95:
send_mail(subject, '\n'.join(lines))
ssh.close()
def send_mail(subject, _text):
# 邮件内容
msg = MIMEText(_text, 'plain', 'utf-8')
msg['From'] = email.utils.formataddr(('zcn', from_addr))
# 邮件标题
msg['Subject'] = subject
msg['To'] = ','.join(to_addrs)
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(from_addr, email_password)
try:
server.sendmail(from_addr, to_addrs, msg.as_string())
finally:
server.quit()
schedule.every(sleep_time).hours.do(job)
# for i in range(24):
# for i in range(0, 24, 2):
# schedule.every().day.at(f"{i:02d}:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
小小60行代码,完成需求,python就是python!:ok_hand:
标签:logging,老大,python,smtp,周五,ssh,import,崩溃,logger From: https://blog.51cto.com/u_16130330/8316952