python监控服务器应⽤⽇志,推送钉钉机器⼈,实时关注⽇志
异常
⽣产环境多台服务器上部署了多个应⽤,⽇志出现报错时,⽆法及时反馈到开发⼈员。部署⼀个⼤型的运维监控应⽤,不但耗资源,⽽且配置也不简单。
简简单单写个python脚本来监控服务器⽇志就简单多了,废话不多说,直接上脚本。
主要逻辑:
1. 使⽤python的subprocess模块,执⾏shell命令,“tail -f” 来监听⽇志⽂件
2. 对输出的⽇志⽂件,逐⾏⽐对字符串,如果匹配到预设的字符串则开始记录,keywords中配置需要预设的异常字符串
3. 开始记录⽇志⾄数组中,可通过rows来预设记录多少条,达到规定数量后
4. 将⽇志内容通过http发送给钉钉服务器,钉钉机器⼈就会在⾥通知我们啦
简单,⾼效,实时
#!/usr/bin/python
# encoding=utf-8
# Filename: monitorLog.py
import os
import signal
import subprocess
import time
import smtplib
from import MIMEText
from email.header import Header
import requests
import json
import threading
serverName="prod:192.168.100.20"
#⽇志⽂件路径地址
logFiles =[
"/opt/app/mall/mall-admin/logs/mall-admin-0.0.1-SNAPSHOT.log",
"/opt/app/mall/mall-portal/logs/mall-portal-0.0.1-SNAPSHOT.log"
];
#机器⼈回调地址 , 钉钉⾥添加⼀个机器⼈就可以了
webhook = 'oapi.dingtalk/robot/send?access_token=38670255eb92cd3a8ce94732fd785dc753134fc1c4d69141f56e942a5d453e5b'
#⽇志缓存数据
logs = []
#记录⽇志⾏数,从匹配⾏开始记录,到达数量就⽤推给钉钉机器⼈
rows = 2
# 是否开始记录⽇志标记位
recordFlags = []
# 检测的关键字数组,⼤⼩写敏感
keywords = []
keywords.append("threw exception")
keywords.append("java.lang.NullPointerException")
keywords.append("com.ption.ApiRRException")
keywords.append("SocketTimeoutException")
#消息内容,url地址python json字符串转数组
def dingtalk(msg,webhook):
headers = {'Content-Type': 'application/json; charset=utf-8'}
data = {'msgtype': 'text', 'text': {'content': msg}, 'at': {'atMobiles': [], 'isAtAll': False}}
post_data = json.dumps(data)
response = requests.post(webhook, headers=headers, data=post_data)
# 检查⾏
def checkLine(line, index):
curLog = logs[index]
if recordFlags[index]==1:
curLog.append(line)
if len(curLog)>rows:
content = "\n".join('%s' %id for id in curLog)
print(content)
dingtalk(content,webhook)
recordFlags[index] = 0
logs[index]=[]
else:
for keyword in keywords:
if keyword in line:
recordFlags[index] = 1
curLog.append(serverName)
curLog.append(logFiles[index])
curLog.append(line)
break
#⽇志⽂件⼀般是按天产⽣,则通过在程序中判断⽂件的产⽣⽇期与当前时间,更换监控的⽇志⽂件
#程序只是简单的⽰例⼀下,监控test1.log 10秒,转向监控test2.log
def monitorLog(logFile, index):
#print('监控的⽇志⽂件是%s' % logFile)
popen = subprocess.Popen('tail -f ' + logFile, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) pid = popen.pid
print('Popen.pid:' + str(pid))
while True:
line = adline().strip()
# 判断内容是否为空
if line:
#print line
checkLine(str(line), index)
if __name__ == '__main__':
for index, logFile in enumerate(logFiles):
logs.append([])
recordFlags.append(0)
tt = threading.Thread(target=monitorLog,args=(logFile,index))
tt.start()
print ("monitor:"+str(logFile))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论