1.实现的处理逻辑
a.在服务器用docker-compose安装sentry
b.定义类(调用请求的处理流程,在调用流程加逻辑处理,记录日志)
c.把中间件加入到django的settings,在logging部分定义日志配置
d.在settings里加sentry的配置
2.安装sentry
使用 Docker 来安装 sentry, 使用 release 版本
• https://github.com/getsentry/onpremise/releases '''得到zip包,解压,进目录'''
• ./install.sh
• docker-compose up -d
3.定义类,调用请求的处理流程,在处理流程中加入处理逻辑,如果有异常,实现钉钉告警和日志记录输出
(D:\djangotest\myrecrument\interview\performance.py)
class PerformanceAndExceptionLoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
start_time = time.time()
response = self.get_response(request)
duration = time.time() - start_time
response["X-Page-Duration-ms"] = int(duration * 1000)
logger.info("duration:%s url:%s parameters:%s", duration, request.path, request.GET.dict() )
if duration > 0:
capture_message('slow url: %s time: %s'%(request.path,duration))
# Code to be executed for each request/response after
# the view is called.
return response
def process_exception(self, request, exception):
if exception:
message = "url: {url} ** msg: {error} \---------- {tb} ---------".format(
url = request.build_absolute_uri(),
error = repr(exception),
tb = traceback.format_exc()
)
logger.warning(message)
# send dingtalk message
#dingtalk.send(message)
# capture exception to sentry:
capture_exception(exception)
return HttpResponse("Error processing the request, please contact the system administrator.", status=500)
4.settings
MIDDLEWARE = [
'interview.performance.PerformanceAndExceptionLoggerMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_sdk.init(
dsn="http://5da41243333d4f6e9b77ee8f14e06d22@129.242.147.78:34012/2",
integrations=[DjangoIntegration()],
# If you wish to associate users to errors (assuming you are using
# django.contrib.auth) you may enable sending PII data.
traces_sample_rate=1, # 采样率
send_default_pii=True #用户认证信息采集
)
效果如下:
用一个例子来演示会更加清晰