Laravel Telescope
簡介
Laravel Telescope 是您本地 Laravel 開發環境的絕佳夥伴。Telescope 提供了對應用程式接收的請求、例外、日誌條目、資料庫查詢、佇列任務 (queued jobs)、郵件、通知、快取操作、排程任務、變數傾印 (variable dumps) 等的深入洞察。

安裝
您可以使用 Composer 套件管理工具將 Telescope 安裝到您的 Laravel 專案中:
composer require laravel/telescope
安裝 Telescope 後,使用 telescope:install
Artisan 命令發佈其資源和遷移。安裝 Telescope 後,您還應該執行 migrate
命令以建立儲存 Telescope 資料所需的資料表:
php artisan telescope:install
php artisan migrate
最後,您可以透過 /telescope
路由存取 Telescope 儀表板。
僅限本地安裝
如果您計畫僅將 Telescope 用於輔助本地開發,您可以使用 --dev
旗標安裝 Telescope:
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
執行 telescope:install
後,您應該從應用程式的 bootstrap/providers.php
設定檔中移除 TelescopeServiceProvider
服務提供者註冊。取而代之的是,手動在 App\Providers\AppServiceProvider
類別的 register
方法中註冊 Telescope 的服務提供者。我們將確保目前環境為 local
後再註冊這些提供者:
/**
* Register any application services.
*/
public function register(): void
{
if ($this->app->environment('local') && class_exists(\Laravel\Telescope\TelescopeServiceProvider::class)) {
$this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
$this->app->register(TelescopeServiceProvider::class);
}
}
最後,您還應該透過將以下內容添加到您的 composer.json
檔案中,防止 Telescope 套件被 自動探索:
"extra": {
"laravel": {
"dont-discover": [
"laravel/telescope"
]
}
},
設定
發佈 Telescope 的資源後,其主要設定檔將位於 config/telescope.php
。此設定檔允許您設定 watcher 選項。每個設定選項都包含其用途的描述,因此請務必詳細探索此檔案。
如果需要,您可以使用 enabled
設定選項完全停用 Telescope 的資料收集:
'enabled' => env('TELESCOPE_ENABLED', true),
資料修剪
如果不修剪,telescope_entries
資料表會非常快速地累積記錄。為緩解此問題,您應該 排程 telescope:prune
Artisan 命令每天執行:
use Illuminate\Support\Facades\Schedule;
Schedule::command('telescope:prune')->daily();
預設情況下,所有超過 24 小時的條目都將被修剪。您可以在呼叫命令時使用 hours
選項來決定保留 Telescope 資料的時間長度。例如,以下命令將刪除所有超過 48 小時前建立的記錄:
use Illuminate\Support\Facades\Schedule;
Schedule::command('telescope:prune --hours=48')->daily();
儀表板授權
Telescope 儀表板可透過 /telescope
路由存取。預設情況下,您只能在 local
環境中存取此儀表板。在您的 app/Providers/TelescopeServiceProvider.php
檔案中,有一個 授權 Gate 定義。此授權 Gate 控制在 非本地 環境中對 Telescope 的存取。您可以根據需要修改此 Gate,以限制對您 Telescope 安裝的存取:
use App\Models\User;
/**
* Register the Telescope gate.
*
* This gate determines who can access Telescope in non-local environments.
*/
protected function gate(): void
{
Gate::define('viewTelescope', function (User $user) {
return in_array($user->email, [
'[email protected]',
]);
});
}
⚠️ 警告
您應該確保在生產環境中將您的 APP_ENV
環境變數更改為 production
。否則,您的 Telescope 安裝將會公開可用。
升級 Telescope
當升級到新的 Telescope 主要版本時,仔細查閱 升級指南 非常重要。
此外,當升級到任何新的 Telescope 版本時,您應該重新發佈 Telescope 的資源:
php artisan telescope:publish
為了保持資源最新並避免未來更新中的問題,您可以將 vendor:publish --tag=laravel-assets
命令添加到應用程式 composer.json
檔案中的 post-update-cmd
腳本:
{
"scripts": {
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
]
}
}
過濾
條目
您可以透過在 App\Providers\TelescopeServiceProvider
類別中定義的 filter
閉包來過濾 Telescope 記錄的資料。預設情況下,此閉包會記錄 local
環境中的所有資料,以及在所有其他環境中的例外、失敗的任務 (failed jobs)、排程任務,以及帶有監控標籤的資料:
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*/
public function register(): void
{
$this->hideSensitiveRequestDetails();
Telescope::filter(function (IncomingEntry $entry) {
if ($this->app->environment('local')) {
return true;
}
return $entry->isReportableException() ||
$entry->isFailedJob() ||
$entry->isScheduledTask() ||
$entry->isSlowQuery() ||
$entry->hasMonitoredTag();
});
}
批次
儘管 filter
閉包會過濾單個條目的資料,您可以使用 filterBatch
方法註冊一個閉包,該閉包會過濾給定請求或主控台命令的所有資料。如果閉包返回 true
,則所有條目都將由 Telescope 記錄:
use Illuminate\Support\Collection;
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*/
public function register(): void
{
$this->hideSensitiveRequestDetails();
Telescope::filterBatch(function (Collection $entries) {
if ($this->app->environment('local')) {
return true;
}
return $entries->contains(function (IncomingEntry $entry) {
return $entry->isReportableException() ||
$entry->isFailedJob() ||
$entry->isScheduledTask() ||
$entry->isSlowQuery() ||
$entry->hasMonitoredTag();
});
});
}
標記
Telescope 允許您依據「標籤」來搜尋條目。通常,標籤是 Eloquent Model 類別名稱或經過驗證的使用者 ID,Telescope 會自動將這些資訊新增至條目。有時,您可能希望為條目附加自己的自訂標籤。為此,您可以使用 Telescope::tag
方法。tag
方法接受一個閉包,該閉包應返回一個標籤陣列。該閉包返回的標籤將與 Telescope 自動附加到條目的任何標籤合併。通常,您應該在 App\Providers\TelescopeServiceProvider
類別的 register
方法中呼叫 tag
方法:
use Laravel\Telescope\EntryType;
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*/
public function register(): void
{
$this->hideSensitiveRequestDetails();
Telescope::tag(function (IncomingEntry $entry) {
return $entry->type === EntryType::REQUEST
? ['status:'.$entry->content['response_status']]
: [];
});
}
可用 Watchers
Telescope 的「watchers」會在請求或主控台命令執行時收集應用程式資料。您可以在 config/telescope.php
設定檔中自訂要啟用的 watchers 列表:
'watchers' => [
Watchers\CacheWatcher::class => true,
Watchers\CommandWatcher::class => true,
// ...
],
有些 watchers 也允許您提供額外的自訂選項:
'watchers' => [
Watchers\QueryWatcher::class => [
'enabled' => env('TELESCOPE_QUERY_WATCHER', true),
'slow' => 100,
],
// ...
],
批次 Watcher
批次 watcher 記錄有關排隊 批次 的資訊,包括任務 (job) 和連線資訊。
快取 Watcher
快取 watcher 在快取鍵被命中、未命中、更新和遺忘時記錄資料。
命令 Watcher
命令 watcher 會在執行 Artisan 命令時記錄引數、選項、結束代碼和輸出。如果您希望將某些命令排除在 watcher 的記錄範圍之外,可以在 config/telescope.php
檔案的 ignore
選項中指定該命令:
'watchers' => [
Watchers\CommandWatcher::class => [
'enabled' => env('TELESCOPE_COMMAND_WATCHER', true),
'ignore' => ['key:generate'],
],
// ...
],
Dump Watcher
dump watcher 在 Telescope 中記錄並顯示您的變數 dumps。當使用 Laravel 時,變數可以使用全域 dump
函數進行 dump。dump watcher 分頁必須在瀏覽器中打開,才能記錄 dump,否則 watcher 將會忽略這些 dumps。
事件 Watcher
事件 watcher 記錄應用程式所派遣的任何 事件 的 payload、監聽器和廣播資料。Laravel 框架的內部事件會被事件 watcher 忽略。
例外 Watcher
例外 watcher 記錄應用程式拋出的任何可報告例外 (reportable exceptions) 的資料和堆疊追蹤。
Gate Watcher
Gate watcher 記錄應用程式執行的 Gate 和 Policy 檢查的資料與結果。如果您想將某些能力 (abilities) 排除在 watcher 的記錄範圍之外,可以在 config/telescope.php
檔案的 ignore_abilities
選項中指定這些能力:
'watchers' => [
Watchers\GateWatcher::class => [
'enabled' => env('TELESCOPE_GATE_WATCHER', true),
'ignore_abilities' => ['viewNova'],
],
// ...
],
HTTP 客戶端 Watcher
HTTP 客戶端 watcher 記錄應用程式發出的對外 HTTP 客戶端請求。
任務 Watcher
任務 watcher 記錄應用程式派遣的任何 任務 (jobs) 的資料和狀態。
日誌 Watcher
日誌 watcher 記錄應用程式寫入的任何 日誌資料。
依預設,Telescope 只會記錄 error
級別及以上的日誌。但是,您可以在應用程式的 config/telescope.php
設定檔中修改 level
選項來更改此行為:
'watchers' => [
Watchers\LogWatcher::class => [
'enabled' => env('TELESCOPE_LOG_WATCHER', true),
'level' => 'debug',
],
// ...
],
郵件 Watcher
郵件 watcher 允許您在瀏覽器中預覽應用程式發送的 電子郵件 及其相關資料。您也可以將電子郵件下載為 .eml
檔案。
Model Watcher
Model watcher 會在 Eloquent Model 事件 派遣時記錄 Model 的變更。您可以透過 watcher 的 events
選項指定要記錄哪些 Model 事件:
'watchers' => [
Watchers\ModelWatcher::class => [
'enabled' => env('TELESCOPE_MODEL_WATCHER', true),
'events' => ['eloquent.created*', 'eloquent.updated*'],
],
// ...
],
如果您想記錄在給定請求期間水合 (hydrated) 的 Model 數量,請啟用 hydrations
選項:
'watchers' => [
Watchers\ModelWatcher::class => [
'enabled' => env('TELESCOPE_MODEL_WATCHER', true),
'events' => ['eloquent.created*', 'eloquent.updated*'],
'hydrations' => true,
],
// ...
],
通知 Watcher
通知 watcher 會記錄應用程式發送的所有 通知。如果通知觸發了電子郵件且您已啟用郵件 watcher,則該電子郵件也將可在郵件 watcher 畫面中預覽。
查詢 Watcher
查詢 watcher 記錄應用程式執行所有查詢的原始 SQL、繫結 (bindings) 和執行時間。watcher 還會將任何慢於 100 毫秒的查詢標記為 slow
。您可以使用 watcher 的 slow
選項自訂慢速查詢的閾值:
'watchers' => [
Watchers\QueryWatcher::class => [
'enabled' => env('TELESCOPE_QUERY_WATCHER', true),
'slow' => 50,
],
// ...
],
Redis Watcher
Redis watcher 記錄應用程式執行的所有 Redis 命令。如果您使用 Redis 進行快取,快取命令也將由 Redis watcher 記錄。
請求 Watcher
請求 watcher 記錄與應用程式處理的任何請求相關的請求、標頭、Session 和回應資料。您可以透過 size_limit
(以 KB 為單位) 選項限制您記錄的回應資料:
'watchers' => [
Watchers\RequestWatcher::class => [
'enabled' => env('TELESCOPE_REQUEST_WATCHER', true),
'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64),
],
// ...
],
排程 Watcher
排程 watcher 記錄應用程式執行的任何 排程任務 的命令和輸出。
視圖 Watcher
視圖 watcher 記錄渲染視圖時使用的 視圖 (view) 名稱、路徑、資料和「composers」。
顯示使用者頭像
Telescope 儀表板會顯示在儲存條目時已驗證的使用者頭像。Telescope 預設會使用 Gravatar 網路服務來擷取頭像。不過,您可以透過在您的 App\Providers\TelescopeServiceProvider
類別中註冊一個回呼來客製化頭像 URL。該回呼會接收使用者的 ID 和電子郵件地址,並應回傳使用者的頭像圖片 URL:
use App\Models\User;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*/
public function register(): void
{
// ...
Telescope::avatar(function (?string $id, ?string $email) {
return ! is_null($id)
? '/avatars/'.User::find($id)->avatar_path
: '/generic-avatar.jpg';
});
}