首頁 > 軟體

python監控紀錄檔中的報錯並進行郵件報警

2022-06-09 18:02:36

前言

在測試過程中,注意力往往都在功能上,如果功能正常,是基本不會檢視紀錄檔的,反之會檢視紀錄檔定位問題。但是表面上的功能正常不能確保紀錄檔沒有報錯,不能確保其他功能點沒有問題,這時我們就需要紀錄檔的監控,一旦有報錯就觸發報警機制(報警機制可以有郵件報警、釘釘微信發訊息報警等),我選擇的是發郵件報警。

實現思路

1、在測試過程中,紀錄檔時時在刷,時時監控難度太大

2、轉換思路,每分鐘對紀錄檔進行掃描一次,發現報錯即報警

  • a.獲取當前時間前一分鐘的紀錄檔,並將紀錄檔全部寫入一個檔案中,每次寫入前會將該檔案清空
  • b.獲取前一分鐘檔案時,方法是獲取前一分鐘紀錄檔的第一行的行號和最後一行的行號,然後將這兩個行號間的所有內容輸出到一個檔案中(這樣做相比於直接根據時間過濾的好處就是會包含報錯內容,因為java紀錄檔中報錯資訊前面是沒有時間的,根據時間過濾就會漏掉報錯資訊)
  • c.在前一分鐘紀錄檔中進行java關鍵詞報錯過濾,並將查詢到的報錯資訊的前後20行(具體多少行根據實際情況而定)內容都輸出到另一個檔案中
  • d.發郵件之前判斷上一步生成的檔案大小,如果大於0(說明有報錯)就觸發郵件,如果等於0就不觸發郵件報警

3.指令碼寫好後,放入crond定時任務中,每分鐘執行一次,即可進行監控

實現程式碼

僅供參考

#!/bin/sh
#紀錄檔路徑
mall_c_log_path='/data/admin/log/mall-c/1.0.0/qa/base/1/mall-c.log'
mall_mg_log_path='/data/admin/log/mall-mg/1.0.0/qa/base/1/mall-mg.log'
#當前時間前一分鐘,精確到分
curdate=`date -d "1 minute ago" +"%Y-%m-%d %H:%M"`
echo ${curdate}
#獲取mall_c要擷取日期紀錄檔的開始和結束行號
c_start_line=`cat -n $mall_c_log_path | grep "${curdate}" | head -1 | cut -f1`
c_end_line=`cat -n $mall_c_log_path | grep "${curdate}" | tail -1 | cut -f1`
#獲取mall_mg要擷取日期紀錄檔的開始和結束行號
mg_start_line=`cat -n $mall_mg_log_path | grep "${curdate}" | head -1 | cut -f1`
mg_end_line=`cat -n $mall_mg_log_path | grep "${curdate}" | tail -1 | cut -f1`
sed -n "$c_start_line,${c_end_line}p" $mall_c_log_path > /data/admin/log_err/mall_c_now.log
sed -n "$mg_start_line,${mg_end_line}p" $mall_mg_log_path > /data/admin/log_err/mall_mg_now.log
#清空錯誤紀錄檔檔案
> /data/admin/log_err/mall-c_err.txt
> /data/admin/log_err/mall-mg_err.txt
#將報錯資訊寫入檔案
err_list=(ArithmeticExecption NullPointerException ClassCastException NegativeArrayException ArrayIndexOutOfBoundsException SecturityException EOFException FileNotFoundException NumberFormatException SQLException IOException NoSuchMethodException SocketTimeoutException)
for i in ${err_list[*]}; do
cat /data/admin/log_err/mall_c_now.log | grep -C 20 "${i}" >> /data/admin/log_err/mall-c_err.txt
cat /data/admin/log_err/mall_mg_now.log | grep -C 20 "${i}" >> /data/admin/log_err/mall-mg_err.txt
done
# -*- coding: UTF-8 -*-
import smtplib,os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
def send_mail_attch():
    #傳送郵箱
    # sender='18706710668@163.com'
    sender='815618406@qq.com'
    #接收郵箱
    receiver='815618406@qq.com'
    #傳送郵箱伺服器
    # smtpserver='smtp.163.com'
    smtpserver='smtp.qq.com'
    #使用者名稱  口令
    # username='18706710668@163.com'
    username='815618406@qq.com'
    password='vwrfpqwbwgsybdah'
    #中文需引數‘utf8',單位元組字元不需要
    # 傳送郵件主題
    subject = '互動贏家QA環境紀錄檔監控報警'
    msg = MIMEMultipart('mixed')
    msg['Subject'] = Header(subject, 'utf-8')
    #郵件正文
    text = "Dear all!n 附件是後端紀錄檔報錯內容,請查收~"
    zw = MIMEText(text,'plain','utf-8')
    msg.attach(zw)
    #郵件附件1
    size_mall_c = os.path.getsize('/data/admin/log_err/mall-c_err.txt')
    if size_mall_c != 0:
        mall_c_log = open('/data/admin/log_err/mall-c_err.txt',"rb")
        send_mall_c_log = mall_c_log.read()
        mall_c_log.close()
        att_1 = MIMEText(send_mall_c_log, 'base64', 'utf-8')
        att_1["Content-Type"] = "application/octet-stream"
        att_1["Content-Disposition"] = "attachment;filename = 'mall_c_err.txt'"
        msg.attach(att_1)
    #郵件附件2
    size_mall_mg = os.path.getsize('/data/admin/log_err/mall-mg_err.txt')
    if size_mall_mg != 0:
        mall_mg_log = open('/data/admin/log_err/mall-mg_err.txt',"rb")
        send_mall_mg_log = mall_mg_log.read()
        mall_mg_log.close()
        att_2 = MIMEText(send_mall_mg_log, 'base64', 'utf-8')
        att_2["Content-Type"] = "application/octet-stream"
        att_2["Content-Disposition"] = "attachment;filename = 'mall_mg_err.txt'"
        msg.attach(att_2)
    msg['to']='815618406@qq.com'
    msg['from']='815618406@qq.com'
    smtp=smtplib.SMTP_SSL('smtp.qq.com',port=465)
    #smtp=smtplib.SMTP()
    #smtp.connect('smtp.qq.com')
    #smtp.set_debuglevel(1)
    smtp.login(username,password)
    smtp.sendmail(sender,receiver,msg.as_string())
    smtp.quit()
if __name__ == '__main__':
    size_mall_c = os.path.getsize('/data/admin/log_err/mall-c_err.txt')
    size_mall_mg = os.path.getsize('/data/admin/log_err/mall-mg_err.txt')
    if (size_mall_c != 0) or (size_mall_mg != 0):
        send_mail_attch()
#!/bin/sh
#執行收集報錯的指令碼
sh /data/admin/log_err/monitor_log_err.sh
sleep 10
#執行傳送郵件指令碼
/usr/bin/python /data/admin/log_err/send_email.py

以上就是python監控紀錄檔中的報錯並進行郵件報警的詳細內容,更多關於python監控紀錄檔報錯郵件報警的資料請關注it145.com其它相關文章!希望能幫到你~


IT145.com E-mail:sddin#qq.com