在公司里做的一個接口系統,主要是對接第三方的系統接口,所以,這個系統里會和很多其他公司的項目交互。隨之而來一個很蛋疼的問題,這么多公司的接口,不同公司接口的穩定性差別很大,訪問量大的時候,有的不怎么行的接口就各種出錯了。
這個接口系統剛剛開發不久,整個系統中,處于比較邊緣的位置,不像其他項目,有日志庫,還有短信告警,一旦出問題,很多情況下都是用戶反饋回來,所以,我的想法是,拿起python,為這個項目寫一個監控。如果在調用某個第三方接口的過程中,大量出錯了,說明這個接口有有問題了,就可以更快的采取措施。
項目的也是有日志庫的,所有的info,error日志都是每隔一分鐘掃描入庫,日志庫是用的mysql,表里有幾個特別重要的字段:
level 日志級別 message 日志內容 file_name Java代碼文件 log_time 日志時間有日志庫,就不用自己去線上環境掃日志分析了,直接從日志庫入手。由于日志庫在線上時每隔1分鐘掃,那我就去日志庫每隔2分鐘掃一次,如果掃到有一定數量的error日志就報警,如果只有一兩條錯誤就可以無視了,也就是短時間爆發大量錯誤日志,就可以斷定系統有問題了。報警方式就用發送郵件,所以,需要做下面幾件事情:
1. 操作MySql。
2. 發送郵件。
3. 定時任務。
4. 日志。
5. 運行腳本。
明確了以上幾件事情,就可以動手了。
操作數據庫
使用MySQLdb這個驅動,直接操作數據庫,主要就是查詢操作。
獲取數據庫的連接:
def get_con(): host = "127.0.0.1" port = 3306 logsdb = "logsdb" user = "root" password = "never tell you" con = MySQLdb.connect(host=host, user=user, passwd=password, db=logsdb, port=port, charset="utf8") return con
從日志庫里獲取數據,獲取當前時間之前2分鐘的數據,首先,根據當前時間進行計算一下時間。之前,計算有問題,現在已經修改。
def calculate_time(): now = time.mktime(datetime.now().timetuple())-60*2 result = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now)) return result然后,根據時間和日志級別去日志庫查詢數據
def get_data(): select_time = calculate_time() logger.info("select time:"+select_time) sql = "select file_name,message from logsdb.app_logs_record " / "where log_time >"+"'"+select_time+"'" / "and level="+"'ERROR'" / "order by log_time desc" conn = get_con() cursor = conn.cursor() cursor.execute(sql) results = cursor.fetchall() cursor.close() conn.close() return results
新聞熱點
疑難解答