Sentry实战教程:应用于Django

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实战

日志捕捉

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

  • 我们会try-catch住一些会发生错误的情况,这些边界情况的发生会有对应的处理策略,而不中断主流程,但同时我们也希望能明确到底发生什么错误,

  • 如果发生断言不该发生的情况,这个时候我们也希望能记录住现场,并发送通知。

在程序中输出一些内容的时候,方便点就直接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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 1 创建一个博客应用 在本书中,你将学习如何创建完整的,可用于生产环境的Django项目。如果你还没有安装Djan...
    lakerszhy阅读 2,679评论 9 22
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • Refer to: www.threemeal.com/blog/12/ 中间件 中间件是一个钩子框架,它们可以介...
    兰山小亭阅读 16,475评论 9 165
  • 忘记了是什么时候发现的这张图片,第一眼便让我爱上了它。 我喜欢三叶草,喜欢它的纤弱,青秀,灵动。它有着让人心怡的灵...
    文者字清阅读 278评论 2 1