1. 程式人生 > >Python磁碟監控、日誌分析監控指令碼

Python磁碟監控、日誌分析監控指令碼

前言:
公司在十一放假期間需要對伺服器和線上專案進行異常監控,以便在出現問題的時候能及時發現,及時地處理。因為公司異常監控系統還不夠完善,特意在Linux伺服器上加上Python監控指令碼來實現簡單的監控功能。

功能:
1、磁碟使用率報警功能。在磁碟使用率超過我們定義的閾值時,會發送郵件到我們的郵箱來通知我們磁碟空間將要不足。
2、日誌分析監控功能。根據關鍵字分析監控系統日誌,並且報警,使系統問題能及時發現,及時處理。

程式碼:log_monitor_real_time.py

#coding:utf-8
import os
import re
import smtplib
import
datetime import shelve from email.mime.text import MIMEText # 硬碟使用率報警閥值 hd_usage_rate_threshold = 80 # 要發給誰 mailto_list=["******@17guagua.com","******@17guagua.com"] # 設定伺服器,使用者名稱、口令以及郵箱的字尾 mail_host="smtp.17guagua.com" mail_user="******@17guagua.com" mail_pass="******" mail_postfix="17guagua.com"
# 日誌偏移 log_offset = shelve.open('log_offset') # 取當天日期 log_path_suffix=(datetime.date.today()).strftime('%Y-%m-%d') # 當前日期key cur_time = 'cur_time' # 日誌路徑 app_info = {} app_info['event'] = ['/opt/log/guagua_web_event_extends/event-ext-'+log_path_suffix+'.log',['失敗','異常'],[]] # 處理日誌 def analysis_log
(appName ,appInfo):
cur_time_val = get_shelve_value(cur_time) if cur_time_val == -1: set_shelve_value(cur_time, log_path_suffix) elif log_path_suffix != cur_time_val: set_shelve_value(appName, 0) set_shelve_value(cur_time, log_path_suffix) f1 = file(appInfo[0], "r") offset = get_shelve_value(appName) if offset != -1: f1.seek(offset,1) else: set_shelve_value(appName, 0) count = 0 exceptionStr = "" for s in f1.readlines(): searchKey = appInfo[1] if len(searchKey) > 0: for i in searchKey: li = re.findall(i, s) if len(li) > 0: count = count + li.count(i) exceptionStr = exceptionStr + " " + s else: li = re.findall('Exception', s) if len(li) > 0: count = count + li.count('Exception') exceptionStr = exceptionStr + " " + s set_shelve_value(appName, f1.tell()) print appName + " 異常數量為 " + str(count) return [count, "---------------------------------" + appName + " ----------------------------- \n " + exceptionStr] #shelve 處理 def set_shelve_value(key, value): log_offset[key] = value def get_shelve_value(key): if log_offset.has_key(key): return log_offset[key] else: return -1 def del_shelve_value(key): if log_offset.has_key(key): del log_offset[key] # 傳送郵件 def send_mail(to_list,sub,content): me = mail_user + "<"+ mail_user + "@" + mail_postfix + ">" msg = MIMEText(content, 'html', 'utf-8') msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() s.connect(mail_host) s.login(mail_user,mail_pass) s.sendmail(me, to_list, msg.as_string()) s.close() return True except Exception, e: print str(e) return False # 獲得外網ip def get_wan_ip(): cmd_get_ip = "/sbin/ifconfig |grep 'inet addr'|awk -F\: '{print $2}'|awk '{print $1}' | grep -v '^127' | grep -v '192'" get_ip_info = os.popen(cmd_get_ip).readline().strip() return get_ip_info # 檢測硬碟使用 def check_hd_use(): cmd_get_hd_use = '/bin/df' try: fp = os.popen(cmd_get_hd_use) except: ErrorInfo = r'get_hd_use_error' print ErrorInfo return ErrorInfo re_obj = re.compile(r'^/dev/.+\s+(?P<used>\d+)%\s+(?P<mount>.+)') hd_use = {} for line in fp: match = re_obj.search(line) if match is not None: hd_use[match.groupdict()['mount']] = match.groupdict()['used'] fp.close() return hd_use # 硬碟使用報警 def hd_use_alarm(): for v in check_hd_use().values(): if int(v) > hd_usage_rate_threshold: if send_mail(mailto_list, 'System Disk Monitor', 'nSystem Ip:%s\nSystem Disk Use:%s' % (get_wan_ip(),check_hd_use())): print "sendmail success!!!!!" else: print "disk not mail" if __name__ == '__main__': hd_use_alarm() exceptionCount = 0 exceptionContents = ""; for key in app_info: exceptionContent = analysis_log(key, app_info[key]) exceptionCount += exceptionContent[0] exceptionContents += exceptionContent[1] exceptionContents = exceptionContents + "*********************************************** \n" print exceptionCount if exceptionCount > 0: if send_mail(mailto_list, get_wan_ip() + " 日誌報警",exceptionContents): print "傳送成功" else: print "傳送失敗"

說明:
1、設定磁碟報警閾值
這裡寫圖片描述

2、指定收件人(一個或者多個)
這裡寫圖片描述

3、增量分析日誌 ,例如 如果設定定時任務每一個小時執行,那麼分析的檔案為 前一個小時的檔案內容,可以根據時間調整

4、指定日誌和關鍵字(一個或者多個)
這裡寫圖片描述

5、指定多個系統日誌路徑
這裡寫圖片描述

使用方法:
指令碼型別 : python
指令碼路徑 : 家目錄 cd ~
需要配合linux 定時任務(crontab -e), 比如 0 /1 * * python /root/log_monitor_real_time.py (每一個小時執行一次)
這裡寫圖片描述

注意事項:
1、測試時可以先手動執行指令碼 python /root/log_monitor_real_time.py ,每次執行會生成 log_offset 檔案,
2、如果再次測試需要先把這個檔案刪掉,因為這個檔案記錄了檔案偏移量,如果不刪除,讀到的檔案開始位置將會是上次處理過的位置

如果想看效果,大家就自己試試吧~~~