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高并发异步服务器核心库forkcore使用方法
Nov 26 Python
Python中实现的RC4算法
Feb 14 Python
django实现分页的方法
May 26 Python
Python多进程机制实例详解
Jul 02 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
简单的Python调度器Schedule详解
Aug 30 Python
python写一个随机点名软件的实例
Nov 28 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python 三种方法实现对Excel表格的读写
Nov 19 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下载远程文件类(支持断点续传)
2008/11/14 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
php过滤敏感词的示例
2014/03/31 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python通过zabbix api获取主机
2018/09/17 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
幼教求职信
2014/03/12 职场文书
婚前协议书范本
2014/04/15 职场文书
清明扫墓感想
2015/08/11 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫