提:
用python寫了一個簡單的log分析,主要也就是查詢一些key,value出來,后面也可以根據(jù)需求增加。查詢出來后,為了好看,搞個html 表格來顯示。
需要的組件: jinja2 flask 的模板。
先說下設(shè)計思路,主要是練習python代碼玩,高手略過
模擬scrapy,搞個管線
每個管線分預(yù)處理,分析器,和后處理。預(yù)處理的話,可以篩選下數(shù)據(jù),分析器提取關(guān)鍵信息,然后把結(jié)果丟給后處理。html報表就是在后處理生成。
再搞個manger類,管理很多個管線,雖然現(xiàn)在單路pipeLine就完成了,說不定以后還能擴展呢。
我們可以定義預(yù)處理,比如過濾一些不關(guān)注的關(guān)鍵字,或者關(guān)注一些特定關(guān)鍵字的行
預(yù)處理的話,只處理QtiDCT-C關(guān)鍵字的日志行。
然后把經(jīng)過預(yù)處理后的數(shù)據(jù)丟給分析器
主要查詢行數(shù)據(jù)行里面是否有keyword,然后根據(jù)分隔符,和結(jié)束符來提取內(nèi)容
keyword delimiter xxxxxendwith 這樣個模式
獲取最終結(jié)果存儲到字典里面 result[keyword]=xxxx。這里會trim,去掉 \r\n.
這樣就有了結(jié)果集result.最后丟給posthandler 后處理。完成報表輸出。
后處理主要是用jinja2的模板,然后傳遞參數(shù),生成最終的html文件。
這里的jinja_template.temple, 內(nèi)容如下
有了模板,就可以在渲染模板的時候提供字典,變量,在模板里面顯示。最終完成報表的輸出。
最終使用
最終在main 方法中,通過-d參數(shù)傳入log所在目錄,然后迭代所有的文件,使用input 把文本文件轉(zhuǎn)換成行數(shù)據(jù)的list,丟給管線,最后把管線丟給manager,調(diào)用process ,完成txt日志的分析,到最后html的生產(chǎn)。
碼功能:
每周一、每周五會有一個shell從數(shù)據(jù)庫中查詢相關(guān)數(shù)據(jù)統(tǒng)計報告到一個record記錄中,這個python程序就是負責分析record并以表格形式發(fā)送郵件給相關(guān)人員。
用的時候需要修改的地方:file_mon/file_fri 這兩個文件路徑,還有發(fā)送郵件的郵件服務(wù)器賬號密碼,以及收件人列表
效果預(yù)覽:正常狀態(tài)(復(fù)制代碼時注意縮進,頭條這個地方比較坑,發(fā)的時候是帶縮進的,但是發(fā)布成功縮進就沒了)
非正常狀態(tài),郵件中會提示異常原因(檢測爬蟲采集數(shù)據(jù)的變化量)
正常狀態(tài)請點擊此處輸入圖片描述
# -*- 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 分別是每周一跟每周五記錄的數(shù)據(jù)格式,放到服務(wù)器上的時候就可以用文件來記錄,這里方便調(diào)試用的變量 """ 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(",") # 周一統(tǒng)計的url提交數(shù)量 data_mon = list_mon[0] # 周五統(tǒng)計的url提交數(shù)量 data_fri = list_fri[1] # 本周工作日提交數(shù)量 data_diff = int(data_fri) - int(data_mon) if len(list_fri) == 5: # 輿情臨時庫記錄總量 content = list_fri[0] # 獲取從數(shù)據(jù)庫中查出來的最近記錄寫入時間 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 = "異常原因:爬蟲狀態(tài)不正常,數(shù)據(jù)庫中存儲的最近一條信息創(chuàng)建時間為: " + str(list_fri[3]) + " 當前時間為: " + str(now) + weekday else: spider_status = "正常" spider_status_content = "" print("爬蟲狀態(tài)正常") def send_mail(to_list, sub): me = mail_user msg = MIMEMultipart() msg['Subject'] = sub msg['From'] = me msg['To'] = ",".join(to_list) # 構(gòu)造html html = """\ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>運維日常數(shù)據(jù)統(tǒng)計報告</title> <body> <div id="container"> <p><strong>運維日常數(shù)據(jù)統(tǒng)計報告</strong></p> <p>采集時間: """ + monday + "~" + friday + """</p> <div id="content"> <table border="1" bordercolor="black" > <tr> <td>輿情臨時庫記錄總量(截止到周末的數(shù)量)</td> <td>關(guān)鍵詞導(dǎo)入狀態(tài)</td> <td>URL提交數(shù)量(周一)</td> <td>URL提交數(shù)量(周五)</td> <td>本周提交url總數(shù)</td> <td>本周工作日平均url數(shù)量</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__': # 設(shè)置服務(wù)器名稱、用戶名、密碼以及郵件后綴 mail_host = 'xxx' mail_user = 'xxx' mail_pass = '123456' # mailto_lists = sys.argv[1] # mailto_list = mailto_lists.split(',') #發(fā)送多人 # sub= sys.argv[2] mailto_list = ['xxx@xxx.com', ] sub = "運維日常數(shù)據(jù)統(tǒng)計報告--" + "采集時間:" + monday + "~" + friday # send_mail(mailto_list, sub) if send_mail(mailto_list, sub): print("Send Mail Success !!!") else: print("Send mail Failed !!!")
歡迎指正。
今天筆者想和大家聊聊Python+selenium自動化生成測試報告,批量執(zhí)行完用例后,生成的測試報告是文本形式的,不夠直觀,為了更好的展示測試報告,最好是生成HTML格式的。
unittest里面是不能生成html格式報告的,需要導(dǎo)入一個第三方的模塊:HTMLTestRunner
1.這個模塊下載不能通過pip安裝了,只能下載后手動導(dǎo)入。
2.Download下HTMLTestRunner.py文件就是我們需要下載的包。
3.下載后復(fù)制到Python安裝文件的Lib目錄下
1.這里主要有三個參數(shù):
stream:測試報告寫入文件的存儲區(qū)域
title:測試報告的主題
description:測試報告的描述
2. report_path是存放測試報告的地址
運行腳本后在F盤指定位置就能找到這個測試報告文件,這時候如果文件多了,不知道測試報告在哪天生成的?能否在文件名上顯示一個日期和時間呢?當然是可以的
備注:
%Y-%m-%d為年月日
%H-%M為時分 注意:時間之間不能使用冒號(:)因為文件名不能使用冒號
1.找到測試報告文件,用瀏覽器打開,點開View里的Detail可以查看詳情描述。
紅框中內(nèi)容顯是英文,我們不能直觀看出是什么測試用例,可以在測試代碼中添加中文注釋,注釋前面要加字母u,代碼修改如下:
Python在 unittest.TestCase 類中提供了很多斷言方法。斷言方法檢查你認為應(yīng)該滿足的條件是否確實滿足。如果該條件確實滿足,你對程序行為的假設(shè)就得到了確認,你就可以確信其中沒有錯誤。如果你認為應(yīng)該滿足的條件實際上并不滿足,Python將引發(fā)異常。下表描述了6個常用的斷言方法。使用這些方法可核實返回的值等于或不等于預(yù)期的值、返回的值為 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)
--判斷兩個參數(shù)相等:first == second
2.assertNotEqual(self, first, second, msg=None)
--判斷兩個參數(shù)不相等: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),其它的斷言方法請自行嘗試)
今天的這篇文章就分享到這里了,喜歡的小伙伴記得點贊評論收藏加關(guān)注喲,關(guān)注我每天給大家不同的驚喜。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。