python3elk相关---根据Elasticsearch(es)日志处理,生成excel并定时邮箱发送附件

python3根据Elasticsearch(es)每天线上更新的日志,做成excel统计表并定时邮箱发送附件

程序是来实现 es中上线更新量的统计

代码实现需要个shell脚本,需要的同学可以问我要

用到几个包介绍一下

xlwt和xlrd,都需要下载,在命令行下(win,linux,mac都可以) pip3 install xxx xxx是要安装的包,都是处理excel的包,一个生成一个读取 yagmail 是个很好的发送邮件的包,使用方便3行就可以,支持上传附件

截图信息:

excel截图

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 17/8/29 上午9:13
# @Author  : lee
# @File    : excel_update.py
# @Software: PyCharm
# 说明: code后有'#'的时测试时加的或者需要修改的code
# 两个参数, 天数和邮件 发送多人可以用list形式 例如 ['xx@xx.com','xxx@xx.com']
import os
import xlwt  # 导入写excel的包
import xlrd  # 读excel
import sys
import yagmail
import datetime
class update(object):
    def __init__(self,day,name):
        self.name = name
        self.day = int(day)
        self.dict_date = {}
        self.dict_date = {}
        self.list_day_of_urgent_update = []
        self.list_alltime = []

    def get_datetime(self): # 获取当前日期和30天内的所欲日期放入list

        oneday = datetime.timedelta(days = 1)
        nowday = datetime.date.today()
        self.nowday = nowday
        for i in range(1, self.day+1):
            theday = nowday - oneday * i
            update_day = theday.strftime('%Y-%m-%d')
            self.list_alltime.append(update_day)
            if theday.strftime('%A') == 'Friday' or theday.strftime('%A') == 'Saturday' or theday.strftime('%A') == 'Sunday':
                # print(theday.strftime('%A'))
                self.list_day_of_urgent_update.append(update_day)


        #print(self.list_alltime)

    def open_log(self):   # 打开对应目录下的日志文件 生成两个文件 保存到当前目录
        for i in self.list_alltime:
            day_of_update = open('log/%s.log' % i, 'r')   #改到服务器 每天产生数据包存放位置
            # for i in day_of_update:
            #     print(i)

            day_of_all_update = open('log/day_of_all_update.log', 'a')
            for line in day_of_update:
                day_of_all_update.writelines(line)
        day_of_all_urgent = open('log/day_of_all_urgent.log', 'a')
        if len(self.list_day_of_urgent_update) != 0:
            for j in self.list_day_of_urgent_update:
                day_of_urgent = open('log/%s.log' % j, 'r')    #这里也是
                for line in day_of_urgent:
                    day_of_all_urgent.writelines(line)
        day_of_all_update.close()
        day_of_all_urgent.close()


    def os_shell(self):  # 调用os 处理整理好的日志文件,统计数量后规则化输出

        os.system('sh runduck.sh day_of_all_update.log  > day_of_all_update.txt')
        os.system('sh runduck.sh day_of_all_urgent.log  > day_of_all_urgent.txt')

    def head_style(self):
        style = xlwt.XFStyle()
        font = xlwt.Font()
        font.height =280
        style.font = font
        alignment = xlwt.Alignment()
        alignment.horz = xlwt.Alignment.HORZ_CENTER    #水平居中
        style.alignment = alignment
        return style
    def body_style(self):
        style = xlwt.XFStyle()
        font = xlwt.Font()
        font.height =280
        style.font = font

        return style

    def write_first(self):   # 将数据规则化输出到excel中
        date_file = open('day_of_all_update.txt')
        counter = 0
        for line in date_file:
            if '------' in line :
                pass
            else:
                self.dict_date[counter] = line.replace('\n','')
                #print(dict_date[counter])
                counter += 1


        wb = xlwt.Workbook()
        sh = wb.add_sheet('昨日更新')
        sh.write_merge(0,0,0,5, '昨日更新')
        sh.write(1,0,'一级目录更新内容')
        sh.write(1,1,'合计')
        sh.write(1,2,'二级目录更新内容')
        sh.write(1,3,'更新次数')
        sh.write(1,4,'紧急更新次数')
        sh.write(1,5,'失败次数')
        counter1 = 1
        for i in self.dict_date:

            if '一级目录更新内容' in self.dict_date[i]:
                sh.write(counter1+1,0,self.dict_date[i+1].split(' ')[0])
                sh.write(counter1+1,1,self.dict_date[i+1].split(' ')[2])
                sh.write(counter1+1,2,self.dict_date[i+3].split(' ')[0])
                sh.write(counter1+1,3,self.dict_date[i+3].split(' ')[2])
                counter1 += 1
                pass
            elif '执行了更新' in self.dict_date[i] and self.dict_date[i-1] != '一级目录更新内容'and self.dict_date[i-1] != '二级目录更新内容' :
                sh.write(counter1+1,2,self.dict_date[i].split(' ')[0])
                sh.write(counter1+1,3,self.dict_date[i].split(' ')[2])
                counter1 += 1

        wb.save('middle.xls')
        date_file.close()

    '''
    函数的作用是找不第二级目录的内容和排序,
    因为xlwt这个包不支持直接读取刚生成的excel文件,
    只能用另外一个包xlrd 读取并获得二级目录的数据和
    '''

    def read_first(self):
        workbook = xlrd.open_workbook(r'middle.xls')
        sheet2 = workbook.sheet_by_name('昨日更新')
        cols = sheet2.col_values(2)
        #print(cols)
        return cols

    def write_second(self):  # 根据获得的二级目录位置信息,再次执行一遍,可以写入紧急更行的信息
        date_file = open('day_of_all_update.txt')
        date_urgent_log = open('day_of_all_urgent.txt')
        dict_urgent = {}
        counter2 = 0

        for line in date_urgent_log:
            if '------' in line :
                pass
            else:
                dict_urgent[counter2] = line.replace('\n','')
                #print(dict_date[counter])
                counter2 += 1
        # for i in dict_urgent:
        #     print(dict_urgent[i])
        counter3 = 0
        for line in date_file:
            if '------' in line :
                pass
            else:
                self.dict_date[counter3] = line.replace('\n','')
                #print(dict_date[counter])
                counter3 += 1

        wb = xlwt.Workbook()
        sh = wb.add_sheet('%s天内更新信息'%self.day)
        first_col=sh.col(0)       #xlwt中是行和列都是从0开始计算的
        th_col=sh.col(2)
        # sec_col=sh.col(0)
        first_col.width=256*20
        th_col.width = 256*20

        if len(self.list_day_of_urgent_update) != 0:

            sh.write_merge(0,0,0,5, '%s天内更新信息'%self.day,self.head_style())
        else:
            sh.write_merge(0,0,0,3, '%s天内更新信息'%self.day,self.head_style())
        #sh.horz = xlwt.Alignment.HORZ_CENTER
        sh.write(1,0,'一级目录更新内容',self.body_style())
        sh.write(1,1,'合计',self.body_style())
        sh.write(1,2,'二级目录更新内容',self.body_style())
        sh.write(1,3,'更新次数',self.body_style())
        if len(self.list_day_of_urgent_update) != 0:
            sh.write(1,4,'紧急更新次数',self.body_style())
            sh.write(1,5,'失败次数',self.body_style())
        counter1 = 1
        # for i in self.dict_date:  #
        #     print(self.dict_date[i])  #
        for i in self.dict_date:

            if '一级目录更新内容' in self.dict_date[i]:
                sh.write(counter1+1,0,self.dict_date[i+1].split(' ')[0],self.body_style())
                sh.write(counter1+1,1,self.dict_date[i+1].split(' ')[2],self.body_style())
                sh.write(counter1+1,2,self.dict_date[i+3].split(' ')[0],self.body_style())
                sh.write(counter1+1,3,self.dict_date[i+3].split(' ')[2],self.body_style())
                counter1 += 1

                pass
            elif '执行了更新' in self.dict_date[i] and self.dict_date[i-1] != '一级目录更新内容'and self.dict_date[i-1] != '二级目录更新内容' :
                sh.write(counter1+1,2,self.dict_date[i].split(' ')[0],self.body_style())
                sh.write(counter1+1,3,self.dict_date[i].split(' ')[2],self.body_style())
                counter1 += 1
        #sh.write(33,33,'二级目录')
        counter_l = 0
        if len(self.list_day_of_urgent_update) != 0:
            for i in self.read_first():
                #print(i)

                for j in dict_urgent:
                    if i != '':
                        if dict_urgent[j] != "一级目录更新内容" and dict_urgent[j] != "二级目录更新内容":
                            # print(dict_urgent[j].replace('\n', '').split(' ')[0])
                            if i == dict_urgent[j].replace('\n', '').split(' ')[0]:
                                sh.write(counter_l,4,dict_urgent[j].replace('\n','').split(' ')[2],self.body_style())
                counter_l += 1

        wb.save('update.xls')   # 产物文件
        date_file.close()



    def markdown(self):  # 根据获得的二级目录位置信息,再次执行一遍,可以写入紧急更行的信息
        date_file = open('day_of_all_update.txt')
        date_urgent_log = open('day_of_all_urgent.txt')
        dict_urgent = {}
        counter2 = 0

        for line in date_urgent_log:
            if '------' in line :
                pass
            else:
                dict_urgent[counter2] = line.replace('\n','')
                #print(dict_date[counter])
                counter2 += 1
        # for i in dict_urgent:
        #     print(dict_urgent[i])
        counter3 = 0
        for line in date_file:
            if '------' in line :
                pass
            else:
                self.dict_date[counter3] = line.replace('\n','')
                #print(dict_date[counter])
                counter3 += 1

        wb = xlwt.Workbook()
        sh = wb.add_sheet('%s天内更新信息'%self.day)
        first_col=sh.col(0)       #xlwt中是行和列都是从0开始计算的
        th_col=sh.col(2)
        # sec_col=sh.col(0)
        first_col.width=256*20
        th_col.width = 256*20

        if len(self.list_day_of_urgent_update) != 0:

            sh.write_merge(0,0,0,5, '%s天内更新信息'%self.day,self.head_style())
        else:
            sh.write_merge(0,0,0,3, '%s天内更新信息'%self.day,self.head_style())
        #sh.horz = xlwt.Alignment.HORZ_CENTER
        sh.write(1,0,'一级目录更新内容',self.body_style())
        sh.write(1,1,'合计',self.body_style())
        sh.write(1,2,'二级目录更新内容',self.body_style())
        sh.write(1,3,'更新次数',self.body_style())
        if len(self.list_day_of_urgent_update) != 0:
            sh.write(1,4,'紧急更新次数',self.body_style())
            sh.write(1,5,'失败次数',self.body_style())
        counter1 = 1
        # for i in self.dict_date:  #
        #     print(self.dict_date[i])  #
        for i in self.dict_date:

            if '一级目录更新内容' in self.dict_date[i]:
                sh.write(counter1+1,0,self.dict_date[i+1].split(' ')[0],self.body_style())
                sh.write(counter1+1,1,self.dict_date[i+1].split(' ')[2],self.body_style())
                sh.write(counter1+1,2,self.dict_date[i+3].split(' ')[0],self.body_style())
                sh.write(counter1+1,3,self.dict_date[i+3].split(' ')[2],self.body_style())
                counter1 += 1

                pass
            elif '执行了更新' in self.dict_date[i] and self.dict_date[i-1] != '一级目录更新内容'and self.dict_date[i-1] != '二级目录更新内容' :
                sh.write(counter1+1,2,self.dict_date[i].split(' ')[0],self.body_style())
                sh.write(counter1+1,3,self.dict_date[i].split(' ')[2],self.body_style())
                counter1 += 1
        #sh.write(33,33,'二级目录')
        counter_l = 0
        if len(self.list_day_of_urgent_update) != 0:
            for i in self.read_first():
                #print(i)

                for j in dict_urgent:
                    if i != '':
                        if dict_urgent[j] != "一级目录更新内容" and dict_urgent[j] != "二级目录更新内容":
                            # print(dict_urgent[j].replace('\n', '').split(' ')[0])
                            if i == dict_urgent[j].replace('\n', '').split(' ')[0]:
                                sh.write(counter_l,4,dict_urgent[j].replace('\n','').split(' ')[2],self.body_style())
                counter_l += 1

        wb.save('update.xls')   # 产物文件
        date_file.close()




    def detele(self):  # 调用os 将产生的临时文件删除

        os.system('rm -rf log/day_all.log')
        os.system('rm -rf log/day_all02.log')
        os.system('rm -rf log/day_of_all_update.log')
        os.system('rm -rf log/day_of_all_urgent.log')
        os.system('rm -rf day_of_all_update.txt')
        os.system('rm -rf day_of_all_urgent.txt')

    def send_mail(self):
        yag = yagmail.SMTP(user='xx@xx.com', password='yonyou@1988', host='smtp.xx.com', port='465')
        body = "附件:一二级目录更新情况"
        if self.name == 'noc':
            self.name = ['xx@xx.com','xx@xx.com']
        self.name = [self.name]
        # yag.send(to='xx@xx.com', subject='工作文件', contents=[body, 'middle.xls'])
        yag.send(to=self.name, subject="%s--%s天内更新情况" % (self.nowday, self.day), contents=[body, 'update.xls'])
        print("给%s成功发送邮件" % self.name)

if __name__ == '__main__':
    item = update(sys.argv[1],sys.argv[2])
    # item = update(1)
    item.get_datetime()
    item.open_log()
    item.os_shell()
    item.write_first()
    item.read_first()
    item.write_second()
    item.detele()
    item.send_mail()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

用R语言抓取网页图片——从此高效存图告别手工时代

今天这个标题实在是有点言过其实了,对于R的爬虫知识,我只是领会了一点儿皮毛。 主要看不懂正则表达式,特别是那种一个括号里要匹配多种类型文本的语句,特像火星文,估...

561110
来自专栏Brian

Install Django Nginx uWSGI

概述 最近项目需要安装和配置多站点环境,所以把多站点开发环境配置和安装记录下来,帮助其他人少走坑。 安装Python 2.7.x 首先安装一些开发环境基本的包和...

42790
来自专栏互联网杂技

我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言

看了不少朋友圈里推荐的Python爬虫文章,都觉得太小儿科,处理内容本来就是PHP的强项,Python唯一的好处估计也就天生的Linux自带,和Perl一样,这...

57170
来自专栏智能算法

Jupyter notebook使用指南

一、Jupyter介绍 Jupyter Notebook是以web交互式的编程接口,是IPython notebook的升级版本。主要是针对python,另外...

3.4K80
来自专栏智能算法

Python相关机器学习‘武器库’

开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python。这些年来,接触和使...

44460
来自专栏Brian

CentOS6 Upgrade Python

CentOS6 升级Python2.7.X和Python3.X ---- 简述 由于产品需要从裸机开始开发所以所有的配置和开发也是从零开始,这个导航是基于cen...

32750
来自专栏Brian

Python 深浅拷贝

Python浅拷贝和深度拷贝 今天面试了一个计算机专业研究生且大学出身也很好,但是面试的结果来看并没有达到我的预期。很多基础计算机的知识貌似都不是很懂,更别说...

46880
来自专栏Brian

数据分析利器-NumPy

---- 概述 NumPy类库是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list s...

36480
来自专栏Brian

Python With-As

深入理解Python的With-as语句 ---- 学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,...

1.2K70
来自专栏互联网杂技

Python爬虫,带你制作高逼格的数据聚合云图

一、直接上几张我的博客数据的云图 1.1 爬取文章的标题的聚合 ? ? 1.2 爬取文章的摘要的聚合 1.3 爬取文章的标题+摘要的聚合 我最近写了Sp...

42680

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励