Sentry实战教程:应用于Django

2018-09-09  本文已影响490人  Gasxia
Sentry

一、概述:

项目在部署到测试、生产环境后,我们便不可能像在开发时那样容易的及时发现处理错误了。首先,一般都是在错误发生后一段时间,才会传递到开发人员,这个时候去查看程序运行的日志,就得熟练使用awk,grep去分析日志了。然后我们找到了错误,也会因为日志中缺少上下文数据,难以分析真正的错误是什么。

Sentry(官网)是解决这个问题的一个工具,设计了很多特性来帮助开发者更快,更方便,更美观的监控错误。

Sentry为多种语言以及各种框架提供了SDK,配置得当后,sentry会在程序运行时,自动收集错误堆栈以及上下文数据,发送到配置的sentry server,开发可以通过sentry web实时查看错误。

错误展示页面

二、Sentry Server安装部署:

官方服务:

如果是刚开始了解Sentry,可以直接使用官方提供的服务,前期有一定的免费额度。使用后觉得挺方便顺手的,土豪可以付费使用,闲杂人等可以自己搭建SentryServer。

自己搭建:

搭建server已经有网友给出比较好的教程了,推荐给大家。

PS: 2018年了,推荐直接使用docker-compose的方式安装,简单省心。

配置邮件服务

编辑docker-compose.yml文件

docker-compose.yml

让同事也可以访问Sentry

Sentry的权限分级是,团队拥有项目,用户有角色和所属团队。

  1. 进入主页。

  2. 点击项目和团队->团队设置。

  3. 输入同事的邮箱,邀请新成员。

三、收集错误

配置项目与Sentry之间的连接

访问sentry server, 点击右上角"新项目"。这里以Django为例子,箭头处输入项目名称,Create Project。

邀请同事加入

接下来页面跳转到在项目中安装与配置sentry的指导页面,我们一条一条看。

安装

pip install raven --upgrade

ravensentry在python语言上的sdk库

配置

djangosettings里配置sentry

INSTALLED_APPS = (
    'raven.contrib.django.raven_compat',
)

配置连接到sentry serverDSNDSN就相当于连接到你sentry server的url,每个项目都单独对应一个DSN

import os
import raven

RAVEN_CONFIG = {
    'dsn': 'http://afe50b021a4049558de19d18d40388d4:866b9b6eeb8d423f890f1a42060d2e76@sentry.vxiaocheng.com/5',
    # If you are using git, you can also automatically configure the
    # release based on the git info.
    # 'release': raven.fetch_git_sha(os.path.abspath(os.pardir)),
}

release的配置官方是没注释的,用来获取当前项目的git hash code,但一般部署生产环境的时候,都跟git没关联了。而且这玩意找不到git还会报错,导致项目无法启动。

测试

执行python manage.py raven test,配置正确的话,在页面上就能看到一条错误日志啦。

至此,我们已经解决了一开始的核心需求“收集错误日志”。

四、Django实战

日志捕捉

程序中除了错误日志需要捕捉外,我们还会有其他情况也要有实时的提醒日志。

在程序中输出一些内容的时候,方便点就直接print了,正式点用logging。Sentry提供了一个logging handler,能使logging输出的内容发送到Sentry,就可以及时的发现边界情况,异常数据等情况了。

配置

在Django settings里添加logging配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'root': {
        'level': 'WARNING',
        'handlers': ['sentry'],
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s  %(asctime)s  %(module)s '
                      '%(process)d  %(thread)d  %(message)s'
        },
    },
    'handlers': {
        'sentry': {
            'level': 'ERROR', # To capture more than ERROR, change to WARNING, INFO, etc.
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
            'tags': {'custom-tag': 'x'},
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'ERROR',
            'handlers': ['console'],
            'propagate': False,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
    },
}

使用

正常使用logging输出就可以了。要注意的是,这种情况下,sentry不会自动获取上下文的数据,所以要利用好参数extra,手动把上下文数据放到里面。如果在上下文中能获取到request,放入extra,sentry也会自动从request中获取一些数据。

import logging
logger = logging.getLogger(__name__)
logger.error('There was some crazy error', exc_info=True, extra={
    # Optionally pass a request and we'll grab any information we can
    'request': request,
})

兼容Exception Middleware

我们可能在项目中已经配置了middleware,在process_exception里对异常做了一些处理。这种情况会抑制住Sentry对异常的收集。需要手动的在middleware里添加代码,发送异常给Sentry。

from raven.contrib.django.raven_compat.models import sentry_exception_handler

class MyMiddleware(object):
    def process_exception(self, request, exception):
        # Make sure the exception signal is fired for Sentry
        sentry_exception_handler(request=request)
        return HttpResponse('foo')

自定义异常页面

用户在操作Web页面时,出现异常后,反馈的时候只能通过描述错误场景,开发根据错误场景去推测复现异常。比较麻烦。

有了Sentry之后,我们可以自定义异常页面,在页面上显示每个异常的x-sentry-id,这样用户直接告知这个id,开发就可以定位处理问题了。

配置方法: https://docs.sentry.io/clients/python/integrations/django/#message-references

错误路由

记录用户访问到的404 url到sentry,实践用起来用处不大,可以不配置。

有兴趣的可以看官方介绍:https://docs.sentry.io/clients/python/integrations/django/#logging

上一篇下一篇

猜你喜欢

热点阅读