Sentry的安装、配置、使用教程(Sentry日志手机系统)


Posted in Python onJuly 23, 2022

前言

上一篇文章介绍了ExceptionLess这个日志收集系统:ExceptionLess的安装、配置、使用

由于ExceptionLess官方提供的客户端只有.Net/.NetCore平台和js的,本文继续介绍另一个日志收集系统:Sentry

Sentry 是一个实时事件日志记录和聚合平台。(官方说的是错误监控 Error Monitor)它专门用于监视错误和提取执行适当的事后操作所需的所有信息,而无需使用标准用户反馈循环的任何麻烦。

Sentry使用Python(Django)开发,功能非常丰富,相比起ExceptionLess来说也重得多(这也是我们在.NetCore平台使用ExceptionLess的原因),其支持的平台很全,基本主流编程语言/框架都有,看图

Sentry的安装、配置、使用教程(Sentry日志手机系统)

除了.NetCore项目,其他的我都使用Sentry来收集日志和报错信息,整体使用下来还是非常不错的,(就是有点耗内存),请准备好一台内存足够大的服务器,起码8G吧~

安装

和ExceptionLess一样,Sentry也可以在线使用,只需要注册一个账号就行了

不过既然是开源免费的,还是自己部署一套比较自由,速度也比较快(Sentry服务器在国外)

老规矩,使用docker做本地部署,最开始用这玩意的时候安装折腾得很,后来官方自己出了个方便的安装脚本,现在安装应该是很容易了。

首先拉取这个项目到本地:https://github.com/getsentry/self-hosted

然后进入项目目录,执行./install.sh,经过漫长的pull和build,根据提示输入管理员的用户名和密码,就完事了

官方提供的这个方案也是通过docker-compose管理容器的,以后我们也可以通过docker-compose相关的命令来手动启停系统。

跑起来后访问http://ip:9000就可以看到登录界面(端口根据实际配置可能不一样)

Sentry的安装、配置、使用教程(Sentry日志手机系统)

用刚才创建的用户名密码登录就行了

配置

Sentry的配置项是真的多,到现在大部分我都还没搞清楚,我只是简单的配置了邮件、端口这些,就可以用得飞起了

接上面的,把官方提供的那个self-host项目clone下来之后,可以看到里面有个sentry文件夹,配置文件就在这目录里。

邮件配置在config.yml文件中,(比ExceptionLess好的一点是邮箱地址终于不需要转义了)

这里以腾讯企业邮箱配置为例,在配置中找到# Mail Server #这个“节点”

mail.backend: 'smtp'  # Use dummy if you want to disable email entirely
mail.host: 'smtp.exmail.qq.com'
mail.port: 465
mail.username: 'demo@demo.com'
mail.password: 'password'
mail.use-tls: false
# mail.use-ssl: false
mail.from: 'demo@demo.com'

这样就可以正常发邮件了~

那么端口要怎么改呢,旧版的onpremise(也就是这个self-host项目)是直接在docker-compose.yml里改的,不过现在不推荐修改这个文件了(官方的这个compose配置文件我甚至看不懂)

现在通过环境变量设置,使用ll -a列出项目目录下所有文件,可以发现有个.env文件,环境变量就在这文件里配置,里面有一行配置端口的

SENTRY_BIND=9000

直接修改就完事了~

使用

Sentry的界面比ExceptionLess的复杂很多,里面的信息也更多,让人看得眼花缭乱

作为日志收集工具的话,主要就是看“问题”页面,可以筛选某个项目,也可以看全部,这点比ExceptionLess直观一些

Sentry的安装、配置、使用教程(Sentry日志手机系统)

点击某一个问题进去可以看到错误详情

Sentry的安装、配置、使用教程(Sentry日志手机系统)

如果是Python这类动态语言,甚至可以直接看到是哪段代码报错,太方便了

Sentry的安装、配置、使用教程(Sentry日志手机系统)

然后性能页面可以细化到每个请求的相应时间、错误频率、访问的用户数量等

Sentry的安装、配置、使用教程(Sentry日志手机系统)

然后再点进去某一个URL还能看到访问这个URL的用户的一些信息,包括IP地址,用户名(如果已登录),页面停留时间,用户都是哪些时间段访问啥的,指标太多了,有些不太懂,反正功能是很强的就对了~

Sentry的安装、配置、使用教程(Sentry日志手机系统)

大概就这些吧,其他功能我还没有深入,等后续继续学习后再来更新博客。

项目集成

首先可以看官网文档,还是比较全的,而且大部分语言都提供了集成的Demo。

文档地址:https://docs.sentry.io/

一些Demo:https://github.com/getsentry/sentry-dotnet/tree/main/samples

直接上几个项目集成的例子吧

本身在Sentry中创建项目时,系统也会显示一个简单的集成指引,这里把我魔改的代码放上来

Django项目

首先根据指引需要安装一个pip包

pip install sentry-sdk

我习惯将项目配置settings.py放在config包下,然后把拆分出来的配置一个个都列在这个包中,方便管理

config下创建sentry.py,代码如下

import logging
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.logging import LoggingIntegration
from sentry_sdk.integrations.redis import RedisIntegration
sentry_logging = LoggingIntegration(
    level=logging.INFO,  # Capture info and above as breadcrumbs
    event_level=logging.ERROR  # Send errors as events
)
sentry_sdk.init(
    # 反正dsn这行无脑复制sentry上显示的就行
    dsn="http://key@sentry地址/id",
    integrations=[DjangoIntegration(), RedisIntegration(), sentry_logging],

    # 这里设置为1代表捕捉100%的transaction 用于性能监控
    traces_sample_rate=1,
    send_default_pii=True,
)

然后在settings.py里引入就完事了

from config import sentry

Flutter项目

根据指引首先要添加依赖

dependencies:
  sentry_flutter: ^5.1.0

PS:现在这个依赖出了6.x版本了,初始化的时候是用异步操作的,我还没更新,就先用5.x版本了

这是原本main.dart中的App初始化代码

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isAndroid) {
      // 以下两行 设置android状态栏为透明的沉浸。
      SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
      SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
  }
  Global.init().then((value) => runApp(MyApp()));
}

引入Sentry之后,需要包装一层

import 'package:sentry_flutter/sentry_flutter.dart';
void main() {
  WidgetsFlutterBinding.ensureInitialized();

  SentryFlutter.init(
    (options) {
      options.dsn = 'http://1335793bf7684f21918248b11cebbf9c@sentry.sblt.deali.cn:9800/9';
    },
    appRunner: () {
      if (Platform.isAndroid) {
        SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
        SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
      }
      Global.init().then((value) => runApp(MyApp()));
    }
  );
}

也就是把原本启动App的代码放在SentryFlutter的appRunner里执行。

AspNetCore项目

虽然AspNetCore项目我们使用ExceptionLess来采集日志,不过在切换到ExceptionLess之前,也用了一段时间的Sentry,Sentry支持的平台那么丰富,在AspNetCore中使用自然也是没问题的。

根据官方指引首先安装依赖

dotnet add package Sentry.AspNetCore -v 3.19.0

然后将sentry的配置写在appsettings.json

"Sentry": {
  "Dsn": "https://examplePublicKey@o0.ingest.sentry.io/0",
  "MaxRequestBodySize": "Always",
  "SendDefaultPii": true,
  "MinimumBreadcrumbLevel": "Debug",
  "MinimumEventLevel": "Warning",
  "AttachStackTrace": true,
  "Debug": true,
  "DiagnosticsLevel": "Error"
}

跟ExceptionLess不同,sentry不用注册服务和添加中间件的方式,而是实现了IWebHostBuilder的扩展方法,在ConfigureWebHostDefaults时就hook到系统中,理论上功能会更强,ExceptionLess通过中间件只能捕捉到类似URL不存在这类HTTP异常,如果是程序中报错是需要手动catch后submit的;而sentry是采用hook的形式(官网说的),可以捕捉到未处理的异常并且上报。(根据微软文档中AspNetCore的启动过程推测出的,理解得不深如果有错误请大佬们指正~)

所以对于AspNetCore3.1项目,修改Program.cs文件,添加一行代码 webBuilder.UseSentry();

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
  .ConfigureWebHostDefaults(webBuilder => {
    webBuilder.UseSentry();
    webBuilder.UseStartup<Startup>();
  });

对于AspNetCore6项目,也是Program.cs文件(.Net6也只有这文件)

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseSentry();

搞定,然后sentry就会捕捉异常并提交

也可以手动提交,比如

void Demo([FromServices] IHub sentry) {
  // 提交普通信息
  sentry.CaptureMessage("hello", SentryLevel.Debug);
  
  try {
    // 会出错的代码
  }
  catch (Exception err) {
      sentry.CaptureException(err);
  }
}

当然根据文档也可以不用依赖注入

using Sentry;
try {
    // 会出错的代码
}
catch (Exception err) {
    SentrySdk.CaptureException(err);
}

OK,先这些吧,其他例子直接看官网就行~

到此这篇关于Sentry的安装、配置、使用的文章就介绍到这了,更多相关Sentry 安装使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Python 相关文章推荐
python快速查找算法应用实例
Sep 26 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
PyQt5 pyqt多线程操作入门
May 05 Python
python opencv实现运动检测
Jul 10 Python
Python爬取成语接龙类网站
Oct 19 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
python3 求约数的实例
Dec 05 Python
如何基于windows实现python定时爬虫
May 01 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
详解Flask开发技巧之异常处理
Jun 15 Python
Python中的 No Module named ***问题及解决
Jul 23 #Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 #Python
Python+pyaudio实现音频控制示例详解
Jul 23 #Python
python高温预警数据获取实例
Jul 23 #Python
Python中的socket网络模块介绍
Jul 23 #Python
python解析照片拍摄时间进行图片整理
Jul 23 #Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 #Python
You might like
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
smarty表格换行实例
2014/12/15 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
市场营销个人求职信范文
2014/02/02 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2019秋季运动会口号
2019/06/25 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python