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