Sentry - 处理异常日志的正确姿势_sentry 自动清除日志_Allen716的博客-程序员秘密

在各种系统和应用里,无论你的代码再完美也还是会抛异常,出错误。今天的主角是当今比较流行的异常记录框架 - Sentry,来了解一下。

关于日志管理

应用越做越复杂,输出日志五花八门,有print的,有写stdout的,有写stderr的, 有写logging的,也有自定义xxx.log的。那么这将导致平台应用日志分布在各个地方,无法统一管理。而且可能用的还不止一种开发语言,想规范和统一日志不是一件容易的事。

为什么使用Sentry

Sentry是一个集中式日志管理系统。它具备以下优点:

  • 多项目,多用户
  • 界面友好
  • 可以配置异常出发规则,例如发送邮件
  • 支持主流语言接口

从Sentry的文档首页截下来的一张图,可以看到它支持目前主流的编程语言。

sentry-supported-platform

安装和快速上手

Sentry支持部署到本地服务器,具体可以参考以下文档:

但作为大多数个人开发者和中小企业,我更建议使用Sentry官网(https://sentry.io/)提供的云服务,你只需要注册一个Sentry账号,就可以快速享受到集中处理异常日志的服务。

Sentry免费版可以:

  • 每月10k 错误日志上限
  • 支持所有平台和语言,功能无缩水
  • 无限项目数量,仅单用户访问,不提供团队功能

具体的价格表可以看这里:

开始配置DSN

你可以认为 DSN(Data Source Name)是Sentry 管理项目需要的PROJECT_ID,每个应用都需要对应一个 PROJECT_ID,以及用于身份认证的 PUBLIC_KEY 和 SECRET_KEY。由此组成一个这样的 DSN:

{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}

PROTOCOL 通常会是 http 或者 https,HOST 为 Sentry 服务的主机名和端口,PATH 通常为空。

在你登入Sentry后台之后,你可以新建一个项目,之后就可以得到类似于下面这样一个DSN。

https://[email protected]/12345

有了DSN以后,你就可以在客户端中将错误日志上传到Sentry了。

配置客户端

这里我主要以Python为例,其他编程语言的客户端配置可以参考官网文档,步骤大同小异。

首先通过pip安装Sentry SDK。

pip install raven --upgrade

然后初始化客户端。

from raven import Client

DSN = 'https://****@sentry.io/****'
client = Client(DSN)

最后,在你需要记录异常的代码为止调用client.captureException()即可。

try:
    1 / 0
except ZeroDivisionError:
    client.captureException()

很多时候我们的异常信息应该包含更多的上下文信息,这样对于我们做后续分析会有更多帮助,那么你可以在Sentry捕获异常前加入这些上下文。

try:
    processing(user, data)

except:
    client.user_context({
        'user': user.email,
        'data': json.dumps(data)
    })
    client.captureException()

一些经验之谈

当然,我们不可能在每处可能发生异常的代码为止都调用Sentry,也不可能去修补过去的代码将Sentry一一植入,一个好的建议是,无论何时,你的程序都有统一的异常处理机制,最好是全局的。这样的话,你只要将Sentry写在全局的异常处理器即可。

另外Sentry还对流行的开发框架提供了特别的支持,比如Flask,Django等等,在这些应用中你只要配置就行,不需要你去写什么全局的异常处理(虽然写起来也不难)。

Flask的例子:

sentry = Sentry(dsn='http://public_key:[email protected]/1')

def create_app():
    app = Flask(__name__)
    sentry.init_app(app)
    return app

Django的例子:

import os
import raven

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

RAVEN_CONFIG = {
    'dsn': 'http://public_key:[email protected]/1',
    # 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)),
}

异常报告和提醒

一旦你完成上面的配置,以后系统发生的所有错误异常都会被自动记录到Sentry,查看报告就是一件轻松愉快的事情了。

默认情况下,一旦异常发生,5分钟内就会有一封邮件送到你邮箱,包含了异常信息的大致描述。

sentry-email-alert

当然你还可以将异常报警集成到更多系统中,比如HICHAT,SLACK,IRC,WEBHOOKS,在Sentry后台提供了相应的入口。

在Sentry的项目 Dashboard 你可以浏览到更详细的报告,比如按照异常信息的类别进行分类和过滤,也可以统计近期异常的状态和频率,非常方便。

sentry-dashboard

Sentry还提供了异常信息的聚合,同样的错误有可能在多处抛出,传统的日志统计起来就不是很方便,在Sentry一目了然。

另外你还可以针对异常问题进行分配和跟踪,例如指派团队的某个成员去处理某一类问题,对于长时间没有再发生的问题自动标记为解决等等。

总结

Sentry 还有有很多亮点,比如敏感信息过滤, release 版本跟踪,关键字查找,受影响用户统计,权限管理等。Sentry 的 plugin 模块还可以集成大量的第三方工具如: SLACK , JIRA 。

对我们来说最大的便利就是利用日志进行错误发现和排查的效率变高了。但是,我们能不能完全依赖Senry呢?有几点值得探讨:

不是日志的替代品

Sentry 的目的是为了让我们专注于系统与程序的异常信息,目的是提高排查问题的效率,日志事件的量到达一个限制时甚至丢弃一些内容。官方也提倡正确设置 Sentry 接收的日志 level 的同时,用户也能继续旧的日志备份。

不是排查错误的万能工具

Sentry 是带有一定策略的问题分析工具,以样本的形式展示部分原始日志的信息。信息不全面的同时,使用过程中也可能出现 Sentry 聚合所带来的负面影响,特别是日志记录质量不够的情况下。

不是传统监控的替代品

与传统的监控系统相比,Sentry 更依赖于发出的日志报告,而另外一些隐藏的逻辑问题或者业务问题很可能是不会得到反馈的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wshl1234567/article/details/100763464

智能推荐

安装wordpress个人网站_weixin_30278237的博客-程序员秘密

实验步骤大致分为5步:1安装Apache(1)使用命令rpm -q httpd查看是否安装httpd否则使用yum -y install httpd命令安装(2)编辑配置文件,切换到conf目录下进行配置,配置前备份目标文件cp httpd.conf /root/httpd.conf.bak(标点符号打错了)3)使用命令vim httpd.conf进行配置,将Serv...

产品体验报告|知米,知否?_hicfly的博客-程序员秘密

一、产品概况1.1 体验环境产品名称:知米背单词产品版本:3.9.0测评设备:iPhone 6操作系统:iOS11.31.2 产品概括知米背单词是一款帮助用户记单词的英语学习软件,采用搭配记单词的方法,将单词置于应用场景中,根据遗忘曲线智能安排学习和复习进度,以此提高学习效率。1.3 产品定位背单词和英语学习的工具,适用于有英语学习需求的所有群体,为用户各种英语学习服务,包括但不限于:1)基础服...

【积水成渊-逐步定制自己的Emacs神器】2:基本的定制Emacs_elloop的博客-程序员秘密

本文介绍了如何定制Emacs的外观和如何组织Emacs配置文件以做到“一处配置随处可用”。外观定制部分仅举个例子,包括:菜单栏、工具栏、滚动条、主题,重在讲解定制方法,读者一旦掌握定制的方法,就可以做更多的定制。

PHP之ThinkPHP有几种查询?-程序员秘密

推荐操作系统:windows7系统、PHP5.6、DELL G3电脑1、聚合查询在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法。获取用户数:Db::table('think_user')->count();//助手函数db('user')->count();2、时间查询使用 where方法。方法支持时间比较,例如://...

MatLab的meshgrid命令详解_输入网格为无效的 meshgrid_yanzi1225627的博客-程序员秘密

详细解释:help meshgridmeshgrid用于从数组a和b产生网格。生成的网格矩阵A和B大小是相同的。它也可以是更高维的。[A,B]=Meshgrid(a,b)生成size(b)Xsize(a)大小的矩阵A和B。它相当于a从一行重复增加到size(b)行,把b转置成一列再重复增加到size(a)列。因此命令等效于:A=ones(size(b))*a;B=b'*ones

zookeeper的安装与使用_小辉辉2345的博客-程序员秘密

安装启动解压zookeeper 修改 zoo_sample.cfg 为 zoo.cfg进入bin 双击zkServer.cmd 启动服务 双击 zkCli.cmd启动客户端简单的使用

随便推点

OC 解决NSArray、NSDictionary直接打印中文出现乱码的问题_我爱吃口香糖的博客-程序员秘密

OC 解决NSArray、NSDictionary直接打印中文出现乱码的问题在iOS开发中,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接打印数组中得中文作处理,直接打印就会出现一堆很讨厌的东西,解决其实很简单,就是需要通过为NSArray添加分类,重写 - (NSString *)descriptionWithLocale:(id)locale方法即可代码如下:

docker下的个人博客wordpress搭建_snow__falling的博客-程序员秘密

Docker下搭建的wordpress个人博客Docker的安装以及使用,官网可以直接看到提供下官方的docker安装地址centos下的docker安装文档centos下docker-compose的安装文档使用docker-compose完成快速搭建docker-compose.yml文件内容version: '3'services: mariadb-wordPress: image: mariadb container_name: mariadb-wordPr

微信APP支付(基于Java实现微信APP支付)_weixin_30668887的博客-程序员秘密

步骤:导入maven依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version...

Airtest搭建批量执行UI自动化脚本,并批量生成html 报告_bduwps8393的博客-程序员秘密

  Airtest 是近几年出的,帮助文档很少,反复查看源帮助文档和其他相关资料,编写了一个安卓UI自动化的轻量小框架。  使用语言:python3.6.8 开发工具:pycharm; python安装airtest :  pip install airtest  框架结构如下:  1、框架简单介绍  air 是多个自动化脚本  conf,lib 配置文件  data 数据 ...

04.Fabric源码解析——配置系统_boss2967的博客-程序员秘密

Fabric源码解析4——配置系统Fabric的配置系统是程序原始数据的来源之一,虽然简单却很重要。在阅读源码过程中对于具象化程序也很有帮助。在分析peer的具体交易工作之前,我们可以先分析一下fabric的配置系统。我们还将我们的目光聚焦在/fabric/peer/main.go的main函数中,除了一系列mainCmd的命令操作,还有viper进行的一系列配置操作,并通过err := com...

【NLP】ACL 2010-2020研究趋势总结_风度78的博客-程序员秘密

作者:哈工大SCIR 车万翔教授导读2020年5月23日,有幸受邀在中国中文信息学会青年工作委员会主办的AIS(ACL-IJCAI-SIGIR)2020顶会论文预讲会上介绍了ACL会议近...

推荐文章

热门文章

相关标签