前言
上一篇文章介紹了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?loggingimport?sentry_sdk
from?sentry_sdk.integrations.django?import?DjangoIntegration
from?sentry_sdk.integrations.logging?import?LoggingIntegration
from?sentry_sdk.integrations.redis?import?RedisIntegrationsentry_logging?=?LoggingIntegration(level=logging.INFO,??#?Capture?info?and?above?as?breadcrumbsevent_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,先這些吧,其他例子直接看官網就行~