文章转自: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+。