今天我在 reddit
上看到 Sentry
的推廣,想到 19 年我第一次在公司自研產(chǎn)品b2b2c上使用 Sentry
的經(jīng)歷,后面在其他項(xiàng)目上多次使用Sentry
,今天就順手分享一下在 Laravel 項(xiàng)目中接入 Sentry 的實(shí)踐心得。
現(xiàn)代項(xiàng)目往往涉及 Web、移動(dòng)端和小程序,錯(cuò)誤追蹤和日志集中化顯得尤其重要,Sentry 在這方面真的挺香的。
安裝與基礎(chǔ)配置
Laravel 后端集成 Sentry 很直觀,官方提供了 SDK。最簡(jiǎn)單的安裝方式是通過(guò) Composer
:
composer require sentry/sentry-laravel
然后在 config/app.php
注冊(cè)服務(wù)提供者(Laravel 5.x):
Sentry\Laravel\ServiceProvider::class,
或者在 Laravel 6+ 可以直接使用自動(dòng)發(fā)現(xiàn)。配置文件可以發(fā)布出來(lái):
php artisan vendor:publish --provider="Sentry\Laravel\ServiceProvider"
會(huì)生成 config/sentry.php
,里面可以設(shè)置 DSN、環(huán)境、采樣率等。比如:
return [
'dsn' => env('SENTRY_DSN'),
'environment' => env('APP_ENV', 'production'),
'traces_sample_rate' => 0.2,
];
前端 Vue 使用官方 JS SDK:
npm install @sentry/vue @sentry/tracing
初始化示例:
import * asSentryfrom"@sentry/vue";
import { Integrations } from"@sentry/tracing";
Sentry.init({
app,
dsn: process.env.VUE_APP_SENTRY_DSN,
integrations: [newIntegrations.BrowserTracing()],
tracesSampleRate: 0.2,
});
移動(dòng)端 iOS/Android 可用官方 SDK 或第三方橋接庫(kù),注意需要在 info.plist 或 AndroidManifest 中聲明權(quán)限。
微信小程序比較特殊,需要在 微信公眾平臺(tái)配置域名白名單,否則 SDK 無(wú)法向 Sentry 發(fā)送數(shù)據(jù)。具體是把 Sentry 的上報(bào)域名加入 request 合法域名即可。
環(huán)境區(qū)分與配置優(yōu)化
在 Laravel 中,可以通過(guò) .env
文件區(qū)分環(huán)境:
SENTRY_DSN_DEV=https://[email protected]/123
SENTRY_DSN_PROD=https://[email protected]/456
APP_ENV=dev
然后在 config/sentry.php
中根據(jù)環(huán)境選擇 DSN:
'dsn' => env('APP_ENV') === 'prod' ? env('SENTRY_DSN_PROD') : env('SENTRY_DSN_DEV'),
這樣開(kāi)發(fā)、預(yù)發(fā)和生產(chǎn)環(huán)境的事件不會(huì)互相干擾。同時(shí)可以調(diào)整 traces_sample_rate
或日志等級(jí),避免開(kāi)發(fā)環(huán)境刷屏。
捕獲異常與忽略策略
Laravel 默認(rèn)會(huì)捕獲異常并發(fā)送到 Sentry,但有些非致命錯(cuò)誤不需要打擾,例如第三方包的警告??梢栽?before_send
鉤子中過(guò)濾:
Sentry\configureScope(function (Sentry\State\Scope $scope): void {
$scope->addEventProcessor(function (array $event) {
if (isset($event['exception']) && str_contains($event['exception']['values'][0]['type'], 'SomeNonCriticalException')) {
return null; // 忽略
}
return $event;
});
});
同時(shí)也可以手動(dòng)捕獲異常:
try {
// 業(yè)務(wù)邏輯
} catch (\Exception $e) {
Sentry\captureException($e);
}
前端 Vue、移動(dòng)端或小程序同理,可以根據(jù) error.message 或 URL 過(guò)濾不必要的事件。
與隊(duì)列和日志結(jié)合
Laravel 隊(duì)列任務(wù)出錯(cuò)時(shí),如果沒(méi)有捕獲,異??赡鼙煌痰簟M扑]在 Handler
或隊(duì)列 Job
中統(tǒng)一處理:
public function failed(Exception $exception)
{
Sentry\captureException($exception);
}
結(jié)合日志系統(tǒng)也很方便,Sentry 可以作為自定義日志通道:
'channels' => [
'sentry' => [
'driver' => 'sentry',
],
],
這樣 Log::channel('sentry')->error('Something happened')
就能發(fā)送到 Sentry,同時(shí)保留本地日志。
跨平臺(tái)注意事項(xiàng)
- 1. Vue 前端:一定要配置 source map,這樣 Sentry 才能顯示真實(shí)的行號(hào)和文件。
- 2. iOS/Android:建議在 release 版本開(kāi)啟符號(hào)化上傳,這樣崩潰棧才可讀。
- 3. 微信小程序:除了域名白名單,還要考慮 network timeout,避免 SDK 堵塞前端邏輯。
小技巧是前端可以捕獲全局未處理異常,統(tǒng)一發(fā)送:
window.addEventListener('error', event => {
Sentry.captureException(event.error);
});
Sentry 平臺(tái)部署
除了 SDK 集成,很多人關(guān)心 Sentry 本身的平臺(tái)選型。Sentry 提供兩種模式:SaaS 和 獨(dú)立部署。
SaaS 版本就是官方托管的服務(wù),你只需要注冊(cè)賬號(hào)、配置 DSN,就能馬上收集錯(cuò)誤,省去運(yùn)維煩惱,升級(jí)和安全都由官方負(fù)責(zé)。適合絕大多數(shù)中小型項(xiàng)目或者希望快速落地的團(tuán)隊(duì)。
獨(dú)立部署則可以把 Sentry 安裝在自己的服務(wù)器上,完全控制數(shù)據(jù)、網(wǎng)絡(luò)訪問(wèn)和存儲(chǔ)策略。部署難度稍高,需要配置 PostgreSQL、Redis、Kafka 等依賴(lài),也需要處理版本升級(jí)和備份策略,但對(duì)數(shù)據(jù)隱私要求高或者企業(yè)內(nèi)網(wǎng)項(xiàng)目,這幾乎是唯一選擇。不過(guò),官方提供了Docker鏡像可以直接使用。
實(shí)際上,在企業(yè)里經(jīng)??吹交旌鲜褂茫貉邪l(fā)環(huán)境或小型項(xiàng)目走 SaaS,核心業(yè)務(wù)走自建,既靈活又安全。Laravel 項(xiàng)目接入時(shí),只要 DSN 對(duì)應(yīng)正確,代碼層面無(wú)需額外改動(dòng),平臺(tái)切換非常順暢。
實(shí)用技巧與優(yōu)化
- ? 批量忽略低優(yōu)先級(jí)錯(cuò)誤,比如 404 或第三方腳本錯(cuò)誤。
- ? 調(diào)整采樣率降低重復(fù)告警,例如
traces_sample_rate: 0.1
。 - ? 配合 release 標(biāo)簽區(qū)分不同版本,便于追蹤回歸問(wèn)題:
Sentry\configureScope(function (Sentry\State\Scope $scope): void {
$scope->setTag('release', config('app.version'));
});
- ? 隊(duì)列和日志結(jié)合,保證即便異步任務(wù)失敗,也能可靠上報(bào)。
寫(xiě)在最后
從 SDK 集成到平臺(tái)部署,其實(shí) Sentry
的魅力就在于統(tǒng)一、多端、可擴(kuò)展。多環(huán)境、多平臺(tái)、隊(duì)列日志結(jié)合后,你會(huì)發(fā)現(xiàn)錯(cuò)誤的可見(jiàn)性大大提高,排查問(wèn)題也不再是盲人摸象的狀態(tài)。19 年 BBC 的經(jīng)歷到現(xiàn)在依然印象深刻,Sentry 幫我節(jié)省了無(wú)數(shù)調(diào)試時(shí)間。今天分享出來(lái),希望對(duì)大家 Laravel 項(xiàng)目的多平臺(tái)錯(cuò)誤監(jiān)控有所啟發(fā)。
寫(xiě)作不易,希望您動(dòng)動(dòng)發(fā)財(cái)?shù)男∈?,幫忙一鍵三連(點(diǎn)贊、推薦、關(guān)注),您的鼓勵(lì),就是我寫(xiě)作的動(dòng)力!