python使用xlsxwriter模板完成nginx趋势图,并自动发邮件

前言:

来到新公司,领导下发了个需求:每周需要对服务器进行一个巡检,以及分析ngxin趋势,由于公司实际生产环境服务器不是特别多,考虑暂时先用脚本完成该需求。

大致思路:收集数据 -> 写入excel制成图表  -> 发邮件

一、收集nginx数据

主要是对nginx log进行一个分析,统计数据。公司使用系统自带的logrotate切割nginx日志,只保存10天日志,并且压缩起来,使用shell分析出来会出现两个日期,遂:将日志文件拷贝到其他路径,解压,并逐个分析,脚本如下:

#!/bin/bash
LogName=nginx.access.log*              #日志文件名
LogPath=/var/log/nginx/nginx.access.log*    #日志路径
NginxPath=/data/scripts/NginxLog/         #解压日志路径
Filename=/data/scripts/NginxLog/nginx.log    #数据收集文件
Temporary=/data/scripts/NginxLog/temporary   #一个临时文件
#拷贝文件并解压
`cp $LogPath $NginxPath`            
`gunzip  $NginxPath$LogName`
#由于日志有两个日期,比较蛋疼,下面输出结果为:13/May/2016 xxxx
function Nglog()
{
        for i in `awk ‘gsub(/\[/," ",$0)‘ $1|awk -F ":| " ‘{++S[$5]}END {for (i in S) print i}‘`
        do
        num=`grep "$i" $1|awk ‘{print $1}‘|sort|uniq -c |wc -l`
        echo $i $num
        done
}
#目录下所有日志进行分析
for i in `ls $NginxPath|grep nginx.access.log`
do
    Nglog $NginxPath$i >> $Temporary
done
#去掉2016,输入到日志
ACC=`awk ‘{a[$1]+=$2}END{for(i in a)print i,a[i]}‘ $Temporary|sort|sed ‘s/\/[0-9]\{4\}//g‘`
echo  "$ACC" > $Filename
#删除临时文件以及日志文件
rm -rf $Temporary
rm -rf $NginxPath$LogName

这样就把日志收集起来,那么如何保存旧数据与新数据呢?

在根目录写另外一个脚本,每次执行前都把名字改成旧数据文件名

`mv $DataFile $LastData`

二、制成图表

使用xlsxwriter生成,部分代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import xlsxwriter
import time
import linecache
DataFile=‘/data/scripts/ServerData‘
LastFile=‘/data/scripts/LastData‘
###处理nginx日志
new_data = ngdata(DataFile)
last_data = ngdata(LastFile)
new_item=[]
new_value=[]
last_item=[]
last_value=[]
for i in new_data:
    new_item.append(i.split()[0])
    new_value.append(int(i.split()[1]))
for l in last_data:
    last_item.append(l.split()[0])
    last_value.append(int(l.split()[1]))
###创建excel表格
Excel_name = "Server_%s.xlsx" % (time.strftime("%Y-%m-%d",time.localtime()))
workbook = xlsxwriter.Workbook(Excel_name)
worksheet = workbook.add_worksheet()
###项目的样式
ItemStyle = workbook.add_format({
        ‘font_size‘:10,
        ‘bold‘:True,
        ‘bg_color‘:‘#101010‘,
        ‘font_color‘:‘#FEFEFE‘,
        ‘align‘:‘center‘,
        ‘align‘:‘vcenter‘,
        ‘top‘:2,
        ‘left‘:2,
        ‘right‘:2,
        ‘bottom‘:2
})
###目标值的样式
ValueStyle = workbook.add_format({
        ‘font_size‘:9,
        ‘font_color‘:‘#151515‘,
        ‘align‘:‘center‘,
        ‘align‘:‘vcenter‘,
        ‘top‘:2,
        ‘left‘:2,
        ‘right‘:2,
        ‘bottom‘:2
})
###写入nginx 数据
row2 = 69
col2 = 0
col3 = 0
row3 = 74
col4 = 0
col5 = 0
worksheet.insert_textbox(‘D68‘,‘Nginx_New_Data‘,{‘fill‘:{‘none‘:True},‘width‘:150,‘height‘:35})
worksheet.insert_textbox(‘D73‘,‘Nginx_Last_Data‘,{‘fill‘:{‘none‘:True},‘width‘:150,‘height‘:35})
for nt in new_item:
    worksheet.write(row2,col2,nt,ItemStyle)
    col2 += 1
for nv in new_value:
    worksheet.write(row2+1,col3,nv,ValueStyle)
    col3 += 1
for lt in last_item:
    worksheet.write(row3,col4,lt,ItemStyle)
    col4 +=1
for lv in last_value:
    worksheet.write(row3+1,col5,lv,ValueStyle)
    col5 +=1
###Nginx图表
NginxChart = workbook.add_chart({‘type‘:‘line‘})
#定义最新数据的线条颜色等
NginxChart.add_series({
    ‘categories‘:‘=Sheet1!$A$70:$I$70‘,    
    ‘values‘:‘=Sheet1!$A$71:$I$71‘,        
    ‘data_labels‘:{‘value‘:True},
        ‘name‘:‘New Data‘,
        ‘line‘:{
            ‘color‘ : ‘#4A4AFF‘,
            ‘width‘:2,
    },
})
#定义旧数据线条颜色等
NginxChart.add_series({
    ‘values‘:‘=Sheet1!$A$76:$I$76‘,
        ‘name‘:‘Last Data‘,
        ‘line‘:{
            ‘color‘ : ‘#BEBEBE‘,
            ‘dash_type‘:‘dash_dot‘,
            ‘width‘:1,
    },
})
NginxChart.set_y_axis({‘name‘:‘Nginx‘})
worksheet.insert_chart(‘A78‘,NginxChart)
workbook.close()

效果图:



三、发送邮件

生成excel后,发送邮件,部分代码如下:

import smtplib
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
sender = ‘邮箱地址‘
receiver = [‘发送人列表‘]
subject = ‘Server Inspection(%s)‘ %(time.strftime("%Y.%m.%d",time.localtime()))
smtpserver = ‘smtp.163.com‘
username = ‘用户名‘
password = ‘密码‘
msg = MIMEMultipart(‘alternative‘)
msg[‘Subject‘] = subject
html = """邮件正文
"""
part = MIMEText(html,‘html‘,‘utf-8‘)   #!这个地方要指定编码,不然发邮会出现乱码
msg.attach(part)
att = MIMEText(open(Excel_name,‘rb‘).read(),‘base64‘,‘utf-8‘)
att["Content-Type"] = ‘application/octet-stream‘
att["Content-Disposition"] = ‘attachment;filename=Server.xlsx‘
msg.attach(att)
smtp = smtplib.SMTP()
smtp.connect(‘smtp.163.com‘)
smtp.login(username,password)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()

最后

将脚本加入任务计划,定制时间执行。

附上最后包装效果:

时间: 2024-08-25 20:31:49

python使用xlsxwriter模板完成nginx趋势图,并自动发邮件的相关文章

python自动发邮件库yagmail

一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smtpserver = 'smtp.sina.com' # 发送邮箱用户/密码 user = '[email protected]' password = '123456' # 发送邮箱 sender = '[email protec

python 自动发邮件

一.一般发邮件的方法 Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件. 注意到构造MIMETEXT对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性. 然后,通过SMTP发出去: 1 # coding:utf-8 2 import smtplib 3 from email.mime.text i

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

Python自动发邮件-yagmail库

之前写过用标准库使用Python Smtplib和email发送邮件,感觉很繁琐,久了不用之后便忘记了.前几天看知乎哪些Python库让你相见恨晚?,看到了yagmail第三方库,学习过程中遇到一些问题,记录在此处. 之前使用的python的smtplib.email模块发模块的一步步骤是: 一.先导入smtplib模块 导入MIMEText库用来做纯文本的邮件模板二.发邮件几个相关的参数,每个邮箱的发件服务器不一样,以126为例子百度搜索服务器是 smtp.126.com三.写邮件主题和正文,

python自动发邮件总结-未完待续

python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. smtplib使用较为简单.以下是最基本的语法. 导入及使用方法如下: import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.163.com,25') smtp.login(username, password) smtp.sendmail(se

python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇下(详解)

简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮件不像日常发送邮件的按天算,时间都是按 秒算的. 电子邮件的发送流程: 1.你使用某款电子邮件软件MUA:mail user agent --邮件用户代理,填写完成点击发送 2.在你点击发送的时候电子邮件软件发出去,到MTA:mail transfer agent--邮件传输代理,即email服务提

用Python实现阿里钉钉机器人读取数据库内容自动发群通知

最近想把一些预警数据信息按照一定的要求自动发送到移动端APP,最终把目标放在了腾讯的微信和阿里的钉钉软件上,由于刚开始学习python,于是编程工具想用python来实现.微信使用群体最广,通过一天的研究用itchat库已经实现,但由于itchat需要用web微信方式登录,发现微信对新注册的用户关闭了web微信功能,于是考虑用备选方案阿里钉钉来实现,其实阿里钉钉虽然没有微信用户群体庞大,但是在企业应用方面比微信强大了太多,很多企业已经开始开始用钉钉作为内部沟通工具. 一.工作准备 1.Pytho

python自动发邮件

想着能用程序自动发邮件就好了,想到就动手写了一个自动发邮件的脚本. 一:前提准备(我使用的是qq邮箱) 1.开通qq邮箱的smtp服务 2.上代码 # -*- coding: utf-8 -*- # @Time : 18-10-14 上午11:00 # @Author : Felix Wang from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.im

Python+selenium自动循环发邮件

Python源代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import randint def auto_throw(target_qq, username, password): """自动循环发邮件""" driver = webdriver.Chrome() driver.get("https://ma