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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 欢迎访问我的博客查看原文:http://wangnan.tech 注:文本整理自《ELKstack权威指南》 架构...
    GhostStories阅读 19,777评论 0 31
  • 博客原文一博客原文二 翻译作品,水平有限,如有错误,烦请留言指正。原文请见 官网英文文档 起步 Elasticse...
    rabbitGYK阅读 3,225评论 0 68
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,369评论 25 707
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,436评论 6 428
  • 曾经一个好朋友跟我聊天,抱怨自己的男朋友,说到激动处甚至决定和他分手。 我问:“为什么?”她说:“他根本不懂我。”...
    一叶孤舟阅读 1,111评论 0 4