生产环境多台服务器上部署了多个应用,日志出现报错时,无法及时反馈到开发人员。部署一个大型的运维监控应用,不但耗资源,而且配置也不简单。

简简单单写个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 email.mime.text 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 = 'https://oapi.dingtalk.com/robot/send?access_token=38670255eb92cd3a8ce94732fd785dc753134fc1c4d69141f56e942a5d453e5b' #日志缓存数据
logs = [] #记录日志行数,从匹配行开始记录,到达数量就用推给钉钉机器人
rows = 2 # 是否开始记录日志标记位
recordFlags = [] # 检测的关键字数组,大小写敏感
keywords = []
keywords.append("threw exception")
keywords.append("java.lang.NullPointerException")
keywords.append("com.macro.mall.exception.ApiRRException")
keywords.append("SocketTimeoutException") #消息内容,url地址
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)
return response.text # 检查行
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 = popen.stdout.readline().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))

  

python监控服务器应用日志,推送钉钉机器人,实时关注日志异常的更多相关文章

  1. asp.net core使用serilog将日志推送到腾讯云日志服务

    为什么是serilog? Serilog是 .NET 中最著名的结构化日志类库. 基于日志事件log events,而不是日志消息log message. 你可以将日志事件格式化为控制台的可读文本或者 ...

  2. pinpoint实现告警推送至钉钉和微信群

    前言 在前面的文章中,我们学习了如何通过java实现将消息发送到钉钉.和将消息发送到微信群聊. 基于上述基础,我们今天来接入pinpoint的告警,发送到钉钉群. 实操前准备 开始之前,推荐阅读一下, ...

  3. prometheus-alertmanager告警推送到钉钉

    1. Prometheus告警简介 告警能力在Prometheus的架构中被划分成两个独立的部分.如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性 ...

  4. Python人脸识别 + 手机推送,老板来了你就会收到短信提示

  5. Python接入企业微信 - 推送信息到内部群里

    前言 之前一篇文章提到了使用wechatpy库来实现企业微信应用登录:Django + Taro 前后端分离项目实现企业微信登录 其实这个库可以实现的功能非常多,基本微信开发涉及到的功能都能实现. 本 ...

  6. python简单爬虫定时推送同花顺直播及荐股至邮箱

    1.初衷:实践 2.技术:python requests Template 3.思路:根据直播页面获取评价最高的前十博主,定时爬行最新的消息和实战股票 4.思路:python 编辑简单邮件html模板 ...

  7. html5 websocket 实时日志推送

    http://blog.csdn.net/neutrojan/article/details/46119645

  8. Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送

    实现Gitlab事件自动触发Jenkins构建及钉钉消息推送 实践环境 GitLab Community Edition 12.6.4 Jenkins 2.284 Post build task 1. ...

  9. Python 巡检接入钉钉机器人

    前段时间,为了快速实现巡检服务器设备的健康状态,我简单的写了一个巡检工具,该工具已经可以满足我的大部分需求了,不过,每次都要自己手动去点击巡检才能知道今天设备的状态,由于每天巡检严重影响我学习逆向技术 ...

随机推荐

  1. fork,vfork和clone底层实现

    分类: LINUX2011-10-13 09:33 1116人阅读 评论(0) 收藏 举报 structdstsignalthreadnulldomain fork,vfork,clone都是linu ...

  2. 利用requets库采集蘑菇租房网的租房信息

    前言:对于我们任何一个漂泊在外的打工者,租房似乎都是我们必经的一个经历,对于我们而言,选择性价比最高,最适合自己的房源至关重要,本文就将利用爬虫技术采集蘑菇租房网上指定的房源信息,后续可以利用这些信息 ...

  3. 安装hadoop2.9.2 jdk1.8 centos7

    安装JDK1.8 查看JDK1.8的安装 https://www.cnblogs.com/TJ21/p/13208514.html 安装hadoop 上传hadoop 下载hadoop     地址h ...

  4. JQuery文件上传插件JQuery.upload.js的用法简介

    JQuery文件上传插件,这个插件很小,用法很简单,效果却很棒.注意:JQuery版本要求1.8及以上,大家执行如果没效果,则检查JQuery版本,如果是1.8及以上,则该插件源码中的.size()需 ...

  5. For setting NODE_ENV you can use any of these methods.

    method 1: set NODE_ENV for all node apps Windows: set NODE_ENV=production Linux or other Unix based ...

  6. CI CD概念

    CI:持续集成 Continuous Integration CD:持续发布 Continuous Delivery (完)

  7. js常用删除

    1.对象删除 1.1删除属性 用(delete 对象.属性 )的方式进行: var people={"name":"zhangsan",age:18}; del ...

  8. 如何Simplest搭建个人博客

    前期 例如wordpress.hexo.hugo-- 准备 安装Node.js,安装Git,进入Hexo网站.进入Github网站进注册和登录. 建议买个阿里云服务器(学生最近好像是免费的) 开始搭建 ...

  9. Python-自动用0补取长度

    描述 Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0. 语法 zfill()方法语法: str.zfill(width) 参数 width -- 指定字符串的长度. ...

  10. 一文了解HAProxy主要特性

    本文转自Rancher Labs 在Kubernetes中,Ingress对象定义了一些路由规则,这些规则规定如何将一个客户端请求路由到指定服务,该服务运行在你的集群中.这些规则可以考虑到输入的HTT ...