Laravel Telescope:优雅的应用调试工具

文章转自:laravel-china.org/topics/1901…
视频教程:047. 优雅的应用调试工具--laravel/telescope (5.7 新扩展)php

Laravel Telescope 是由 Mohamed Said 和 Taylor Otwell 开源 的 Laravel 应用的调试工具。laravel

你可使用 Composer 安装到你的应用中。git

安装完 Telescope 后,你能够访问 /telescope 来访问该应用。github

Telescope 能作什么事?

若是你以前用过 Clockwork 或者 Laravel Debugbar ,那么这两款应用与 Telescope 进行对比的话就是纯 UI 界面和重量级武器。web

Telescope 由一系列监听器组成,这些 "监听器" 监听每一个进入应用的请求,不论是来自 HTTP 、命令行、任务调度仍是队列的。数据库

这些监听器捕获这些请求以及其相关数据信息 -- 例如数据库查询以及其执行时间,是否命中缓存,事件触发邮件触发等等。数组

在它操做界面上有用于检查如下各项的选项栏,每一个选项栏都表明它的监听器:浏览器

  • Requests
  • Commands
  • Schedule
  • Jobs
  • Exceptions
  • Logs
  • Dumps
  • Queries
  • Models
  • Events
  • Mail
  • Notifications
  • Cache
  • Redis

观察者标签

让咱们逐步浏览每一个选项查看观察到的内容。每一个选项都显示一个列表页面,而后您能够点击查看指定项目的详细信息。缓存

(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一模一样)

Exceptions

该功能将记录全部异常,并可查看具体异常状况。界面使用选项卡的形式呈现,包括主机信息,类型,请求,标签,用户身份验证等。

除此以外也可看到异常在代码中的位置,使其高亮并展现上下代码段,且包含完整的堆栈追踪。

你还能够从抛出异常请求中获取指向异常详情页面的连接。

注意:在众多选项卡中,若是您在单个页面上(例如,给定的异常页面),你也可得到指向生成该页面的请求连接。

若是产生屡次相同的异常,它们将在列表页面上进行分组,但仍然能够深刻查看异常显示页面中的各个异常。

Logs

日志项展现了日志的基本信息,级别和每条日志项的记录时间。

当你访问日志的单个详细页面时,你能够看到更多消息,包含全部你传递给日志的上下文数据(做为数组)。

"比挖掘原始文本文件棒一点。".

当你用数组为你的日志项传递上下文时,你能够查看全部数据,查看触发它的请求,触发的用户。"比挖掘原始文本文件棒一点。

Dump screen

"这是我最爱的功能之一"

若是你代码中使用 dump() 函数,并且你在 Telescope 中打开了 dump screen。你能够在 Telescope 中看到 dumps 并不是来自你实际应用。这为你提供了数据的 dd() 样式输出,而不会弄乱您的正常页面加载。每一个 dump 还连接到生成它的请求。

若是你离开 dump screen,你全部的 dumps 会忽然再次显示到你的浏览器上。

Queries

列出了全部数据查询相关信息,就像 debug bar 同样。如 消耗时常、完整查询、请求触发 等。

漂亮的格式化显示。

能够在服务中配置慢查询的边界,一旦查询查过其配置时间将会被标记,并配以红色警告显示。

注意:每一个列表页都有快捷方式和快速搜索。搜索标签和其余内容。

Models

能够看到 查询、更新、删除事件;以及这些事件产生的变化 等。

事件

显示全部事件的列表。能够看到哪些事件是经过标记广播的;查看全部侦听器的列表,并深刻了解调用的对象。

邮件

显示发送的全部电子邮件的列表;收件人是谁;何时发的;是否还在队列,而后何时出队的。能够看到电子邮件主题,当你深刻研究它时,你也会看到诸如 MailTrap 的邮件预览。

甚至能够下载原始的 .eml 文件并在选定的客户端中打开。

Notifications

显示全部通知,及其类型,等等。

没法预览,由于有些通知是不可预览的,假如是邮件通知,你就会看到它在列表中。

若是通知已进入队列,还能够在 Jobs 的请求部分看到。有不少方式能够获得这些数据。

Cache

显示缓存命中、未命中和更新等。

显示键,值,什么时候过时。能够看到触发它的请求,也能够在请求页面上看到该请求的全部缓存命中/未命中。

Redis

跟上面的缓存相似。

诸如花了多久时间,何时发生,何时发起请求等等。

Authenticated user

在任一选项卡的条目上获取已验证用户的相关信息。

Authorization

可在生产环境的 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() 来开启夜晚模式(可能在某个服务提供者那里?)

Q&A:

  • 数据存放在何处?隐藏在一个 StorageRepository 接口实现以后; 相似数据库同样运做在 Redis 上。你能够为所欲为的实现它。这个接口中只有6-7 个方法。

  • 它能存多少数据?不是太多,由于生产环境几乎会抛弃全部的东西,修剪下来,你一次只能保存 100 个。

  • 咱们能从 Slack 收到通知吗?咱们正在努力。

  • 我能退出 Bugsnag/etc.吗? 可能不能。虽然它简易且轻便,但并不意味着稳定健壮。当心火烛。

  • 咱们可否按照时间戳进行过滤?暂时还不能,可是这个是开源项目,帮帮咱们

  • 在系统引导阶段会产生什么影响?每次只会执行一个查询。生产环境中不会频繁地把全部东西都插入进去。你能够取消你不关心的监听器。

  • 咱们能在同一个UI中检查多个应用吗?能够;只须要在同一个数据库中指向并记录它们,而后考虑作标记/过滤, 这样你就能够按需作区分了。

  • Laravel 的哪一个版本能与之兼容? 5.7.7+。

相关文章
相关标签/搜索