首頁 > 軟體

Sentry的安裝、設定、使用教學(Sentry紀錄檔手機系統)

2022-07-23 10:00:28

前言

上一篇文章介紹了ExceptionLess這個紀錄檔收集系統:ExceptionLess的安裝、設定、使用

由於ExceptionLess官方提供的使用者端只有.Net/.NetCore平臺和js的,本文繼續介紹另一個紀錄檔收集系統:Sentry

Sentry 是一個實時事件紀錄檔記錄和聚合平臺。(官方說的是錯誤監控 Error Monitor)它專門用於監視錯誤和提取執行適當的事後操作所需的所有資訊,而無需使用標準使用者反饋迴圈的任何麻煩。

Sentry使用Python(Django)開發,功能非常豐富,相比起ExceptionLess來說也重得多(這也是我們在.NetCore平臺使用ExceptionLess的原因),其支援的平臺很全,基本主流程式語言/框架都有,看圖

除了.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的設定項是真的多,到現在大部分我都還沒搞清楚,我只是簡單的設定了郵件、埠這些,就可以用得飛起了

接上面的,把官方提供的那個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直觀一些

點選某一個問題進去可以看到錯誤詳情

如果是Python這類動態語言,甚至可以直接看到是哪段程式碼報錯,太方便了

然後效能頁面可以細化到每個請求的相應時間、錯誤頻率、存取的使用者數量等

然後再點進去某一個URL還能看到存取這個URL的使用者的一些資訊,包括IP地址,使用者名稱(如果已登入),頁面停留時間,使用者都是哪些時間段存取啥的,指標太多了,有些不太懂,反正功能是很強的就對了~

大概就這些吧,其他功能我還沒有深入,等後續繼續學習後再來更新部落格。

專案整合

首先可以看官網檔案,還是比較全的,而且大部分語言都提供了整合的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 安裝使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com