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中的array数组模块相关使用
Jul 05 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
python仿evething的文件搜索器实例代码
May 13 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
python中selenium库的基本使用详解
Jul 31 Python
通过实例简单了解python yield使用方法
Aug 06 Python
基于Python正确读取资源文件
Sep 14 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
Python语言规范之Pylint的详细用法
Jun 24 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
javascript preload&amp;lazy load
2010/05/13 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
对Django url的几种使用方式详解
2019/08/06 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python构造函数init实例方法解析
2020/01/19 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
自荐信怎么写好
2013/11/11 职场文书
写给保洁员表扬信
2014/01/08 职场文书
考核工作实施方案
2014/03/30 职场文书
2014年学生工作总结
2014/11/20 职场文书
大学生逃课检讨书
2015/05/04 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android