在各种系统和应用里,无论你的代码再完美也还是会抛异常,出错误。今天的主角是当今比较流行的异常记录框架 - Sentry,来了解一下。
应用越做越复杂,输出日志五花八门,有print的,有写stdout的,有写stderr的, 有写logging的,也有自定义xxx.log的。那么这将导致平台应用日志分布在各个地方,无法统一管理。而且可能用的还不止一种开发语言,想规范和统一日志不是一件容易的事。
Sentry是一个集中式日志管理系统。它具备以下优点:
从Sentry的文档首页截下来的一张图,可以看到它支持目前主流的编程语言。
Sentry支持部署到本地服务器,具体可以参考以下文档:
但作为大多数个人开发者和中小企业,我更建议使用Sentry官网(https://sentry.io/)提供的云服务,你只需要注册一个Sentry账号,就可以快速享受到集中处理异常日志的服务。
Sentry免费版可以:
具体的价格表可以看这里:
你可以认为 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分钟内就会有一封邮件送到你邮箱,包含了异常信息的大致描述。
当然你还可以将异常报警集成到更多系统中,比如HICHAT,SLACK,IRC,WEBHOOKS,在Sentry后台提供了相应的入口。
在Sentry的项目 Dashboard 你可以浏览到更详细的报告,比如按照异常信息的类别进行分类和过滤,也可以统计近期异常的状态和频率,非常方便。
Sentry还提供了异常信息的聚合,同样的错误有可能在多处抛出,传统的日志统计起来就不是很方便,在Sentry一目了然。
另外你还可以针对异常问题进行分配和跟踪,例如指派团队的某个成员去处理某一类问题,对于长时间没有再发生的问题自动标记为解决等等。
Sentry 还有有很多亮点,比如敏感信息过滤, release 版本跟踪,关键字查找,受影响用户统计,权限管理等。Sentry 的 plugin 模块还可以集成大量的第三方工具如: SLACK , JIRA 。
对我们来说最大的便利就是利用日志进行错误发现和排查的效率变高了。但是,我们能不能完全依赖Senry呢?有几点值得探讨:
Sentry 的目的是为了让我们专注于系统与程序的异常信息,目的是提高排查问题的效率,日志事件的量到达一个限制时甚至丢弃一些内容。官方也提倡正确设置 Sentry 接收的日志 level 的同时,用户也能继续旧的日志备份。
Sentry 是带有一定策略的问题分析工具,以样本的形式展示部分原始日志的信息。信息不全面的同时,使用过程中也可能出现 Sentry 聚合所带来的负面影响,特别是日志记录质量不够的情况下。
与传统的监控系统相比,Sentry 更依赖于发出的日志报告,而另外一些隐藏的逻辑问题或者业务问题很可能是不会得到反馈的。
实验步骤大致分为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...
一、产品概况1.1 体验环境产品名称:知米背单词产品版本:3.9.0测评设备:iPhone 6操作系统:iOS11.31.2 产品概括知米背单词是一款帮助用户记单词的英语学习软件,采用搭配记单词的方法,将单词置于应用场景中,根据遗忘曲线智能安排学习和复习进度,以此提高学习效率。1.3 产品定位背单词和英语学习的工具,适用于有英语学习需求的所有群体,为用户各种英语学习服务,包括但不限于:1)基础服...
本文介绍了如何定制Emacs的外观和如何组织Emacs配置文件以做到“一处配置随处可用”。外观定制部分仅举个例子,包括:菜单栏、工具栏、滚动条、主题,重在讲解定制方法,读者一旦掌握定制的方法,就可以做更多的定制。
推荐操作系统:windows7系统、PHP5.6、DELL G3电脑1、聚合查询在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法。获取用户数:Db::table('think_user')->count();//助手函数db('user')->count();2、时间查询使用 where方法。方法支持时间比较,例如://...
详细解释: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 修改 zoo_sample.cfg 为 zoo.cfg进入bin 双击zkServer.cmd 启动服务 双击 zkCli.cmd启动客户端简单的使用
OC 解决NSArray、NSDictionary直接打印中文出现乱码的问题在iOS开发中,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接打印数组中得中文作处理,直接打印就会出现一堆很讨厌的东西,解决其实很简单,就是需要通过为NSArray添加分类,重写 - (NSString *)descriptionWithLocale:(id)locale方法即可代码如下:
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
步骤:导入maven依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version...
Airtest 是近几年出的,帮助文档很少,反复查看源帮助文档和其他相关资料,编写了一个安卓UI自动化的轻量小框架。 使用语言:python3.6.8 开发工具:pycharm; python安装airtest : pip install airtest 框架结构如下: 1、框架简单介绍 air 是多个自动化脚本 conf,lib 配置文件 data 数据 ...
Fabric源码解析4——配置系统Fabric的配置系统是程序原始数据的来源之一,虽然简单却很重要。在阅读源码过程中对于具象化程序也很有帮助。在分析peer的具体交易工作之前,我们可以先分析一下fabric的配置系统。我们还将我们的目光聚焦在/fabric/peer/main.go的main函数中,除了一系列mainCmd的命令操作,还有viper进行的一系列配置操作,并通过err := com...
作者:哈工大SCIR 车万翔教授导读2020年5月23日,有幸受邀在中国中文信息学会青年工作委员会主办的AIS(ACL-IJCAI-SIGIR)2020顶会论文预讲会上介绍了ACL会议近...