摘要:发送到企业微信,微信实现即时告警的系统十分好用,使用,之类的可以快捷地实现保存日志到文件,发送错误日志给管理员的功能。发送的到企业微信配置的系统接下来我们需要配置一下的系统,来发送级别的到企业微信。微信接口实现运维报警
发送Django error log 到企业微信,python+微信实现即时告警
Django的logging系统十分好用,使用file,mail_admins之类的handlers可以快捷地实现保存日志到文件,发送错误日志给管理员的功能。但是,如果能直接将应用的错误日志发送到手机上,实现即时告警,岂不是更好?
首先需要注册一个企业微信账号,地址是:
https://work.weixin.qq.com/we...
**注意**:
注册过程如果是为企业使用要选择企业,然后上传企业的资质证明,如果是个人注册,选择团队,然后输入自己的身份证号即可完成注册.
然后进入企业应用页面,添加一个应用,添加完成后,进入应用页面:
这里的agentid和secret需要留意, 后续的发送信息api需要它们。
另外我们还需要corpid,在我的企业-企业信息中可以找到。
使用企业微信API发送消息测试使用企业微信API发送消息:
企业微信API:发送消息
例子:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
def get_token():
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
values = {
"corpid": "",
"corpsecret": "",
}
req = requests.post(url, params=values)
data = json.loads(req.text)
return data["access_token"]
def send_msg():
url = ("https://qyapi.weixin.qq.com/cgi-bin/message/send"
"?access_token={}").format(get_token())
values = {
# "touser": "@all",
"toparty": "2",
"msgtype": "text",
"agentid": "",
"text": {
"content": u"报警测试,toparty: 2"
},
}
req = requests.post(url, json.dumps(values))
print(values, req)
if __name__ == "__main__":
send_msg()
其中toparty:2,意为向id为2的部门的所有成员发送消息。 使用touser:@all, 可以向所有人发送信息。发送django的log到企业微信
配置Django的logging系统
接下来我们需要配置一下django的logging系统,来发送ERROR级别的log到企业微信。
我的思路是可以参照django自带的AdminEmailHandler写一个WechatAlarmHandler。
代码如下:
import logging
import requests
import json
from copy import copy
from django.core.cache import cache
from django.views.debug import ExceptionReporter
class WechatAlarmHandler(logging.Handler):
"""An exception log handler that sends log entries to wechat alarm bot.
"""
def __init__(self):
logging.Handler.__init__(self)
def emit(self, record):
try:
request = record.request
subject = "%s (%s IP): %s" % (
record.levelname,
("internal" if request.META.get("REMOTE_ADDR") in settings.INTERNAL_IPS # NOQA
else "EXTERNAL"),
record.getMessage()
)
except Exception:
subject = "%s: %s" % (
record.levelname,
record.getMessage()
)
request = None
subject = self.format_subject(subject)
message = self.format(record)
self.send_msg(subject, message)
def send_msg(self, subject, message=None, *args, **kwargs):
WechatAlarm().send_msg("{}
{}".format(subject, message))
def format_subject(self, subject):
"""
Escape CR and LF characters.
"""
return subject.replace("
", "
").replace("
", "
")
class WechatAlarm:
def __init__(self, corpid="",
corpsecret="",
agentid="", partyid=""):
self.corpid = corpid
self.partyid = partyid
self.key = "wechat_send_alarm_key"
self.corpsecret = corpsecret
self.agentid = agentid
def get_token(self):
token = cache.get(self.key)
if token:
return token
else:
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
values = {
"corpid": self.corpid,
"corpsecret": self.corpsecret,
}
req = requests.post(url, params=values)
data = json.loads(req.text)
cache.set(self.key, data["access_token"], 7200)
return data["access_token"]
def send_msg(self, content=None):
url = ("https://qyapi.weixin.qq.com/cgi-bin/message/send"
"?access_token={}").format(self.get_token())
values = {
# "touser": "@all",
"toparty": self.partyid,
"msgtype": "text",
"agentid": self.agentid,
"text": {
"content": content,
},
}
return requests.post(url, json.dumps(values))
再配置一下django的settings里的LOGGING:
GGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "[%(asctime)s](%(levelname)s)<%(name)s.%(funcName)s>{%(process)d/%(thread)d} : %(message)s"
},
"simple": {
"format": "%(levelname)s %(message)s"
},
},
"filters": {
"require_debug_false": {
"()": "django.utils.log.RequireDebugFalse"
}
},
"handlers": {
"null": {
"level": "DEBUG",
"class": "django.utils.log.NullHandler",
},
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple"
},
"mail_admins": {
"level": "ERROR",
"class": "django.utils.log.AdminEmailHandler",
"filters": ["require_debug_false"],
},
"send_wechat": {
"level": "ERROR",
"class": "utils.log.WechatAlarmHandler", # your handler path
},
"file": {
"level": "INFO",
"class": "logging.handlers.TimedRotatingFileHandler",
"formatter": "verbose",
"filename": webservice_logfile,
"when": "D"
},
},
"loggers": {
"": {
"handlers": ["file", "mail_admins", "send_wechat"],
"propagate": True,
"level": "ERROR",
},
"django": {
"handlers": ["file", "mail_admins"],
"propagate": True,
"level": "ERROR",
},
"django.request": {
"handlers": ["file", "mail_admins", ],
"level": "ERROR",
"propagate": True,
},
}
}
即,在handler里增加了一个send_wechat, 在loggers里的handers里增加了send_wechat。
这样django的error log就会通过企业微信发送到手机了。
Python+微信接口实现运维报警 ↩
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/8010.html
摘要:发送到企业微信,微信实现即时告警的系统十分好用,使用,之类的可以快捷地实现保存日志到文件,发送错误日志给管理员的功能。发送的到企业微信配置的系统接下来我们需要配置一下的系统,来发送级别的到企业微信。微信接口实现运维报警 发送Django error log 到企业微信,python+微信实现即时告警 Django的logging系统十分好用,使用file,mail_admins之类的h...
摘要:工作原理周期性的查询并且将数据传递给规则类型,规则类型定义了需要查询哪些数据。要做根据频率变化的告警。 ElastAlert 工作原理 It works by combining Elasticsearch with two types of components, rule types and alerts. Elasticsearch is periodically queried...
摘要:它采用了请求响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理弊端协议无法实现服务器主动向客户端发起消息。如何使用客户端创建对象属性表示连接状态可选值表示连接尚未建立。表示连接正在进行关闭。 一言不合就上效果图演示showImg(https://segmentfault.com/img/bVbkUDl?w=1920&h=638); 项目:http://112.74.164.1...
摘要:添加接收人监控中心支持添加邮箱及微信两种告警,需要注意的是,添加邮箱告警的话,需要预先配置发件服务器。由于监控中心配置了一条告警规则,只要企业微信的信息填写正确,一般分钟以内均可从企业微信中获取到告警信息。监控中心概述监控中心是UK8S提供的产品化监控方案,提供基于Prometheus的产品解决方案,涵盖Prometheus集群的全生命周期管理,以及告警规则配置、报警设置等功能,省去了自行搭...
阅读 770·2023-04-25 17:26
阅读 1769·2021-08-05 09:58
阅读 2150·2019-08-30 13:17
阅读 1173·2019-08-28 17:52
阅读 1279·2019-08-26 18:27
阅读 1640·2019-08-26 14:05
阅读 3838·2019-08-26 14:05
阅读 1916·2019-08-26 10:45