文章轉自:laravel-china.org/topics/1901…
視頻教程:047. 優雅的應用調試工具--laravel/telescope (5.7 新擴展)php
Laravel Telescope 是由 Mohamed Said 和 Taylor Otwell 開源 的 Laravel 應用的調試工具。laravel
你可使用 Composer 安裝到你的應用中。git
安裝完 Telescope 後,你能夠訪問 /telescope
來訪問該應用。github
若是你以前用過 Clockwork 或者 Laravel Debugbar ,那麼這兩款應用與 Telescope 進行對比的話就是純 UI 界面和重量級武器。web
Telescope 由一系列監聽器組成,這些 "監聽器" 監聽每一個進入應用的請求,不論是來自 HTTP 、命令行、任務調度仍是隊列的。數據庫
這些監聽器捕獲這些請求以及其相關數據信息 -- 例如數據庫查詢以及其執行時間,是否命中緩存,事件觸發郵件觸發等等。數組
在它操做界面上有用於檢查如下各項的選項欄,每一個選項欄都表明它的監聽器:瀏覽器
讓咱們逐步瀏覽每一個選項查看觀察到的內容。每一個選項都顯示一個列表頁面,而後您能夠點擊查看指定項目的詳細信息。緩存
該選項容許您查看進入應用程序的全部 HTTP 請求。您將能查看全部 HTTP 請求以及每一個請求的詳細信息。bash
每一個請求頁面還會顯示來自其餘觀察者關於此請求相關的數據;例如,全部數據庫查詢以及它們花費時長;該請求已經過身份驗證用戶;等等。
命令選項列出已運行的全部命令及其退出代碼。您還能夠點擊查看全部參數,選項和相關內容。
列出已運行的計劃任務。在每一個任務的詳細信息頁面上,查看他們的全部計劃信息,例如他們的 cron 計劃(例如 * * * * *
)。
任務部分會列出全部運行過,和正在運行的任務。他和Horizon很相似,不過Horizon只支持Redis驅動,並且它不只僅是UI,它還能和隊列溝通,看你隊列運行的狀況。Telescope,簡簡單單只是一個UI,一個能夠和任何隊列驅動玩在一塊兒的UI。
在任務列表頁上,你會看到任務名,和它在哪一個隊列和鏈接上運行,她的工做狀況,和其所發生的經歷。
在任務細節頁面上,你會看到以上列舉的數據,以及:主機名, 他的FQCN,網絡鏈接,隊列,嘗試次數,超時,還有標籤。
任務會自動給用過的Eloquent模型貼標籤 (栗子: App\Video:1
) ,若是用過用戶模型,就會給用戶模型貼標籤,以此類推。
標籤
諸如請求,命令等項目,會自動被Telescope貼標籤 (舉栗子: 若是一個用戶發出了請求,他就自動會被貼上Auth:1
if User 1 ; 若是你點擊那個標籤, Telescope就只會顯示被貼上該標籤的項目)
如HTTP請求通常,你能夠看到全部與此任務相關的信息,好比數據庫查詢記錄,其觸發的其餘任務,和任何生成的日誌。
不過,你如若出發了封閉函數,那麼你所見之信息不是 App\Jobs\RenderVideo
, 取而代之的是 Closure (web.php:43)
.
新封閉函數隊列
Taylor寫了一個新的庫,加回了隊列封閉函數 (Laravel不少年前用過)。 這個庫的功能是,當你將一個模型放入封閉函數中,它只會存這個模型的ID,而不是整個對象。(原做者說的: 豈不妙哉?(反正隊列的類已經如此做爲了),他很興奮)。
dispatch(function () use ($video) { // do stuff in a queued job // 作一些隊列的事情 });
這樣作之後,封閉函數會被序列化,而且有一個哈希(Hash)值如影隨形。這樣能夠防止你的代碼在進入隊列事件後,代碼被篡改,非常很差。如今有了哈希,函數會先被檢查一遍,媽媽就不怕個人代碼被篡改了。
該封閉函數會被序列化爲一個長字符串,加上他的哈希(與簽名URL一模一樣)
該功能將記錄全部異常,並可查看具體異常狀況。界面使用選項卡的形式呈現,包括主機信息,類型,請求,標籤,用戶身份驗證等。
除此以外也可看到異常在代碼中的位置,使其高亮並展現上下代碼段,且包含完整的堆棧追蹤。
你還能夠從拋出異常請求中獲取指向異常詳情頁面的連接。
注意:在衆多選項卡中,若是您在單個頁面上(例如,給定的異常頁面),你也可得到指向生成該頁面的請求連接。
若是產生屢次相同的異常,它們將在列表頁面上進行分組,但仍然能夠深刻查看異常顯示頁面中的各個異常。
日誌項展現了日誌的基本信息,級別和每條日誌項的記錄時間。
當你訪問日誌的單個詳細頁面時,你能夠看到更多消息,包含全部你傳遞給日誌的上下文數據(做爲數組)。
"比挖掘原始文本文件棒一點。".
當你用數組爲你的日誌項傳遞上下文時,你能夠查看全部數據,查看觸發它的請求,觸發的用戶。"比挖掘原始文本文件棒一點。
"這是我最愛的功能之一"
若是你代碼中使用 dump()
函數,並且你在 Telescope 中打開了 dump screen。你能夠在 Telescope 中看到 dumps 並不是來自你實際應用。這爲你提供了數據的 dd()
樣式輸出,而不會弄亂您的正常頁面加載。每一個 dump 還連接到生成它的請求。
若是你離開 dump screen,你全部的 dumps 會忽然再次顯示到你的瀏覽器上。
列出了全部數據查詢相關信息,就像 debug bar 同樣。如 消耗時常、完整查詢、請求觸發 等。
漂亮的格式化顯示。
能夠在服務中配置慢查詢的邊界,一旦查詢查過其配置時間將會被標記,並配以紅色警告顯示。
注意:每一個列表頁都有快捷方式和快速搜索。搜索標籤和其餘內容。
能夠看到 查詢、更新、刪除事件;以及這些事件產生的變化 等。
顯示全部事件的列表。能夠看到哪些事件是經過標記廣播的;查看全部偵聽器的列表,並深刻了解調用的對象。
顯示發送的全部電子郵件的列表;收件人是誰;何時發的;是否還在隊列,而後何時出隊的。能夠看到電子郵件主題,當你深刻研究它時,你也會看到諸如 MailTrap 的郵件預覽。
甚至能夠下載原始的 .eml
文件並在選定的客戶端中打開。
顯示全部通知,及其類型,等等。
沒法預覽,由於有些通知是不可預覽的,假如是郵件通知,你就會看到它在列表中。
若是通知已進入隊列,還能夠在 Jobs 的請求部分看到。有不少方式能夠獲得這些數據。
顯示緩存命中、未命中和更新等。
顯示鍵,值,什麼時候過時。能夠看到觸發它的請求,也能夠在請求頁面上看到該請求的全部緩存命中/未命中。
跟上面的緩存相似。
諸如花了多久時間,何時發生,何時發起請求等等。
在任一選項卡的條目上獲取已驗證用戶的相關信息。
可在生產環境的 telescope 服務中,配置可訪問的郵件帳戶列表
在Gate 的 viewTelescope 中定義哪些用戶能夠訪問
你可能不想在生產環境中把全部東西都存着,因此你能夠在 Telescope 服務提供者中, 運行 Telescope::filter(function ($entry))
。
默認篩選器:
function ($entry) {
if (local) { return true; }
return $entry->isReportableException ||
$entry->isfailedJob() ||
$entry->isScheduledTask() ||
$entry->hasMonitoredTag();
}
複製代碼
可是你能夠自由地修改它。
點進雷達按鈕,聲明一個監控標籤。你能夠在 UI 界面聲明一個 Auth:1
監視器。
生產環境中不會記錄請求,可是若是你有一個像 Auth:1
這樣的監視器,你就會看到全部的請求都被記錄下來,除非你取消監視。
NOTE: 若是你使用的是 Redis 隊列的話, Horizon 和 Telescope 能完美搭配。
在 Telescope 中任務調度會修剪掉過時的條目。你能夠每晚都刪除超過__ 小時的東西。
這個也是在 config/telescope 中設置。
能夠隨時啓用或棄用任意觀察者。 E.g. Watchers\CacheWatcher::class
就能夠棄用。
還有一個 TELESCOPE_LIMIT
默認定義是 100 ;該選項的意義就是一次性進行 100 個查詢,100 次 Redis 查詢等。它們均可以在env
中進行配置。
Telescope 能夠在本地和生產環境中運行,並有內建受權和工具用來保護私有數據。它可從多角度訪問同類數據,具有一系列配置項,提供了健壯的標記和過濾功能。
考慮把它放在一個獨立的數據庫中。
Taylor 稍後就在 Twitter 上提到你能夠添加過濾器從而確保私有數據不會被記錄下來。
你可使用 Telescope::night()
來開啓夜晚模式(可能在某個服務提供者那裏?)
數據存放在何處?隱藏在一個 StorageRepository 接口實現以後; 相似數據庫同樣運做在 Redis 上。你能夠爲所欲爲的實現它。這個接口中只有6-7 個方法。
它能存多少數據?不是太多,由於生產環境幾乎會拋棄全部的東西,修剪下來,你一次只能保存 100 個。
咱們能從 Slack 收到通知嗎?咱們正在努力。
我能退出 Bugsnag/etc.嗎? 可能不能。雖然它簡易且輕便,但並不意味着穩定健壯。當心火燭。
咱們可否按照時間戳進行過濾?暫時還不能,可是這個是開源項目,幫幫咱們
在系統引導階段會產生什麼影響?每次只會執行一個查詢。生產環境中不會頻繁地把全部東西都插入進去。你能夠取消你不關心的監聽器。
咱們能在同一個UI中檢查多個應用嗎?能夠;只須要在同一個數據庫中指向並記錄它們,而後考慮作標記/過濾, 這樣你就能夠按需作區分了。
Laravel 的哪一個版本能與之兼容? 5.7.7+。