提:
用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html 表格来显示。
需要的组件: jinja2 flask 的模板。
先说下设计思路,主要是练习python代码玩,高手略过
模拟scrapy,搞个管线
每个管线分预处理,分析器,和后处理。预处理的话,可以筛选下数据,分析器提取关键信息,然后把结果丢给后处理。html报表就是在后处理生成。
再搞个manger类,管理很多个管线,虽然现在单路pipeLine就完成了,说不定以后还能扩展呢。
我们可以定义预处理,比如过滤一些不关注的关键字,或者关注一些特定关键字的行
预处理的话,只处理QtiDCT-C关键字的日志行。
然后把经过预处理后的数据丢给分析器
主要查询行数据行里面是否有keyword,然后根据分隔符,和结束符来提取内容
keyword delimiter xxxxxendwith 这样个模式
获取最终结果存储到字典里面 result[keyword]=xxxx。这里会trim,去掉 \r\n.
这样就有了结果集result.最后丢给posthandler 后处理。完成报表输出。
后处理主要是用jinja2的模板,然后传递参数,生成最终的html文件。
这里的jinja_template.temple, 内容如下
有了模板,就可以在渲染模板的时候提供字典,变量,在模板里面显示。最终完成报表的输出。
最终使用
最终在main 方法中,通过-d参数传入log所在目录,然后迭代所有的文件,使用input 把文本文件转换成行数据的list,丢给管线,最后把管线丢给manager,调用process ,完成txt日志的分析,到最后html的生产。
码功能:
每周一、每周五会有一个shell从数据库中查询相关数据统计报告到一个record记录中,这个python程序就是负责分析record并以表格形式发送邮件给相关人员。
用的时候需要修改的地方:file_mon/file_fri 这两个文件路径,还有发送邮件的邮件服务器账号密码,以及收件人列表
效果预览:正常状态(复制代码时注意缩进,头条这个地方比较坑,发的时候是带缩进的,但是发布成功缩进就没了)
非正常状态,邮件中会提示异常原因(检测爬虫采集数据的变化量)
正常状态请点击此处输入图片描述
# -*- coding:utf-8 -*- import os from datetime import datetime, time from datetime import timedelta from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEBase from email.mime.text import MIMEText import smtplib """ AUTHOR: tommy.yu Email: xxx 下面str_mon/str_fri 分别是每周一跟每周五记录的数据格式,放到服务器上的时候就可以用文件来记录,这里方便调试用的变量 """ str_mon = "2123332,11,2017-12-16 10:00:00,2017-12-16 10:00:11" str_fri = "8804324,2223332,11,2017-12-18 10:00:00,2017-12-19 10:00:11" file_mon = "/mnt/167_tmp/data_Monday" file_fri = "/mnt/167_tmp/data_Friday" if os.path.exists(file_mon): str_mon = open(file_mon).read().split("\n")[1] else: print("%s不存在" % file_mon) if os.path.exists(file_fri): str_fri = open(file_fri).read().split("\n")[1] else: print("%s不存在" % file_fri) now = datetime.now() list_mon = str_mon.split(",") list_fri = str_fri.split(",") # 周一统计的url提交数量 data_mon = list_mon[0] # 周五统计的url提交数量 data_fri = list_fri[1] # 本周工作日提交数量 data_diff = int(data_fri) - int(data_mon) if len(list_fri) == 5: # 舆情临时库记录总量 content = list_fri[0] # 获取从数据库中查出来的最近记录写入时间 end = list_fri[3].split(" ")[0] # 获取当前周的周五 # 0,1,2,3,4,5,6 分别代表周一到周日 cur_monday = now - timedelta(datetime.now().weekday() - 0) cur_friday = now - timedelta(datetime.now().weekday() - 4) monday = cur_monday.strftime("%Y-%m-%d") friday = cur_friday.strftime("%Y-%m-%d") print("时间范围:%s~%s" % (monday, friday)) if friday != end: spider_status = "异常" weekday = now.strftime("%A") spider_status_content = "异常原因:爬虫状态不正常,数据库中存储的最近一条信息创建时间为: " + str(list_fri[3]) + " 当前时间为: " + str(now) + weekday else: spider_status = "正常" spider_status_content = "" print("爬虫状态正常") def send_mail(to_list, sub): me = mail_user msg = MIMEMultipart() msg['Subject'] = sub msg['From'] = me msg['To'] = ",".join(to_list) # 构造html html = """\ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>运维日常数据统计报告</title> <body> <div id="container"> <p><strong>运维日常数据统计报告</strong></p> <p>采集时间: """ + monday + "~" + friday + """</p> <div id="content"> <table border="1" bordercolor="black" > <tr> <td>舆情临时库记录总量(截止到周末的数量)</td> <td>关键词导入状态</td> <td>URL提交数量(周一)</td> <td>URL提交数量(周五)</td> <td>本周提交url总数</td> <td>本周工作日平均url数量</td> </tr> <tr> <td>""" + content + """</td> <td>""" + spider_status + """</td> <td>""" + data_mon + """</td> <td>""" + data_fri + """</td> <td>""" + str(data_diff) + """</td> <td>""" + str(data_diff / 5) + """</td> </tr> </table> </div> </div> <p><strong>""" + spider_status_content + """</strong> </p> </div> </body> </html> """ context = MIMEText(html, _subtype='html', _charset='utf-8') # 解决乱码 msg.attach(context) try: send_smtp = smtplib.SMTP() send_smtp.connect(mail_host) send_smtp.login(mail_user, mail_pass) send_smtp.sendmail(me, to_list, msg.as_string()) send_smtp.close() return True except Exception as e: print(e) return False """""" if __name__ == '__main__': # 设置服务器名称、用户名、密码以及邮件后缀 mail_host = 'xxx' mail_user = 'xxx' mail_pass = '123456' # mailto_lists = sys.argv[1] # mailto_list = mailto_lists.split(',') #发送多人 # sub= sys.argv[2] mailto_list = ['xxx@xxx.com', ] sub = "运维日常数据统计报告--" + "采集时间:" + monday + "~" + friday # send_mail(mailto_list, sub) if send_mail(mailto_list, sub): print("Send Mail Success !!!") else: print("Send mail Failed !!!")
欢迎指正。
今天笔者想和大家聊聊Python+selenium自动化生成测试报告,批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。
unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner
1.这个模块下载不能通过pip安装了,只能下载后手动导入。
2.Download下HTMLTestRunner.py文件就是我们需要下载的包。
3.下载后复制到Python安装文件的Lib目录下
1.这里主要有三个参数:
stream:测试报告写入文件的存储区域
title:测试报告的主题
description:测试报告的描述
2. report_path是存放测试报告的地址
运行脚本后在F盘指定位置就能找到这个测试报告文件,这时候如果文件多了,不知道测试报告在哪天生成的?能否在文件名上显示一个日期和时间呢?当然是可以的
备注:
%Y-%m-%d为年月日
%H-%M为时分 注意:时间之间不能使用冒号(:)因为文件名不能使用冒号
1.找到测试报告文件,用浏览器打开,点开View里的Detail可以查看详情描述。
红框中内容显是英文,我们不能直观看出是什么测试用例,可以在测试代码中添加中文注释,注释前面要加字母u,代码修改如下:
Python在 unittest.TestCase 类中提供了很多断言方法。断言方法检查你认为应该满足的条件是否确实满足。如果该条件确实满足,你对程序行为的假设就得到了确认,你就可以确信其中没有错误。如果你认为应该满足的条件实际上并不满足,Python将引发异常。下表描述了6个常用的断言方法。使用这些方法可核实返回的值等于或不等于预期的值、返回的值为 True 或 False 、返回的值在列表中或不在列表中。你只能在继承 unittest.TestCase 的类中使用这些方法。
unittest常用的断言方法 | |
方法 | 用途 |
assertEqual(a, b) | 核实 a == b |
assertNotEqual(a, b) | 核实 a != b |
assertTrue(x) | 核实 x 为 True |
assertFalse(x) | 核实 x 为 False |
assertIn( item , list ) | 核实 item 在 list 中 |
assertNotIn( item , list ) | 核实 item 不在 list 中 |
1.assertEqual(self, first, second, msg=None)
--判断两个参数相等:first == second
2.assertNotEqual(self, first, second, msg=None)
--判断两个参数不相等:first != second
3.assertIn(self, member, container, msg=None)
--判断是字符串是否包含:member in container
4.assertNotIn(self, member, container, msg=None)
--判断是字符串是否不包含:member not in container
5.assertTrue(self, expr, msg=None)
--判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
--判断是否为假:expr is False
7.assertIsNone(self, obj, msg=None)
--判断是否为None:obj is None
8.assertIsNotNone(self, obj, msg=None)--判断是否不为None:obj is not None
实例:assertEqual(a, b),其它的断言方法请自行尝试)
今天的这篇文章就分享到这里了,喜欢的小伙伴记得点赞评论收藏加关注哟,关注我每天给大家不同的惊喜。
*请认真填写需求信息,我们会在24小时内与您取得联系。