当前位置: 首页 > 后端技术 > PHP

LaravelTelescope:优雅的应用调试工具

时间:2023-03-29 14:30:53 PHP

文章转自:https://laravel-china.org/topics/19013\视频教程:047.优雅的应用调试工具——laravel/telescope(5.7新扩展)LaravelTelescope由MohamedSaid和TaylorOtwell开源的Laravel应用程序调试工具。您可以使用Composer将它安装到您的应用程序中。安装Telescope后,您可以访问/telescope来访问该应用程序。望远镜能做什么?如果你之前使用过Clockwork或者LaravelDebugbar,那么这两款应用与Telescope相比,就是纯UI界面和重量级武器。Telescope由一系列“侦听器”组成,它们侦听进入应用程序的每个请求,无论是来自HTTP、命令行、任务调度程序还是队列。这些侦听器捕获这些请求及其相关数据信息——例如数据库查询及其执行时间、是否命中缓存、事件触发电子邮件触发器等。在其界面上有用于检查以下内容的选项卡,每个选项卡都代表其侦听器:RequestsCommandsScheduleJobsExceptionsLogsDumpsQueriesModelsEventsMailNotificationsCacheRedisObserver选项卡让我们逐步浏览每个选项以查看观察到的内容。每个选项都会显示一个列表页面,然后您可以单击该页面以查看指定项目的详细信息。(HTTP)Requests此选项允许您查看进入应用程序的所有HTTP请求。您将能够查看所有HTTP请求和每个请求的详细信息。每个请求页面还显示来自其他观察者的关于该请求的数据;例如,所有数据库查询及其花费的时间;请求的经过身份验证的用户;等等。命令行命令选项列出了所有已运行的命令及其退出代码。您也可以点击查看所有参数、选项及相关内容。计划任务列出已运行的计划任务。在每个任务的详细信息页面上,查看它们的所有计划信息,例如它们的cron计划(例如*****)。任务任务部分列出了所有正在运行和正在运行的任务。它和Horizo??n很像,但是Horizo??n只支持Redisdriver,而且它不仅仅是一个UI,还可以和队列通信,看看你的队列运行的怎么样。Telescope只是一个UI,一个可以和任何队列驱动一起玩的UI。在任务列表页面上,您将看到任务的名称、它正在运行的队列和连接、它正在做什么以及它发生了什么。在作业详细信息页面上,您将看到上面列出的数据,以及:主机名、其FQCN、网络连接、队列、尝试、超时和标记。任务会自动标注使用的Eloquent模型(栗子:App\Video:1),如果使用了用户模型,则会标注用户模型,以此类推。Tags\Items比如请求、命令等,会被Telescope自动打上标签(例如:如果一个用户发送了一个请求,他会自动被打上Auth:1ifUser1的标签;如果你点击那个标签,Telescope会onlydisplayItemstaggedwiththistag)likeHTTPrequests,你可以看到与这个任务相关的所有信息,比如数据库查询记录,它触发的其他任务,以及任何产生的日志。但是,如果你启动关闭函数,那么你看到的信息不是App\Jobs\RenderVideo,而是Closure(web.php:43)。新的闭包函数queue\Taylor写了一个新的库,并在后面添加了Queue闭包函数(Laravel很多年前就用过)。这个库的作用是当你把一个模型放入封闭函数中时,它只会存储模型的ID,而不是整个对象。(原作者说:是不是很精彩?(反正队列类已经这样做了),他很激动)。\dispatch(function()use($video){//dostuffinaqueuedjob//dosomequeuedthings});\这样做之后,封闭函数将被序列化并具有哈希(Hash)值手拉手前进。这样可以防止你的代码在进入队列事件后被篡改,这是非常糟糕的。现在有了hash,会先检查函数,妈妈就不怕我的代码被篡改了。\关闭的函数会序列化成一个长字符串,加上它的hash(和签名URL一模一样)Exceptions这个函数会记录所有的异常,具体的异常可以查看。界面以选项卡的形式呈现,包括主机信息、类型、请求、标签、用户认证等。此外,您还可以在代码中看到异常的位置,它突出显示上下代码段,并包含完整的堆栈跟踪。您还可以从引发异常的请求中获取指向异常详细信息页面的链接。注意:在众多选项卡中,如果您在单个页面上(例如,给定的异常页面),您还会获得指向生成该页面的请求的链接。如果多次出现相同的异常,它们将在列表页面上进行分组,但仍然可以在异常显示页面中向下钻取到单个异常。Logs日志项显示了日志的基本信息、级别和每个日志项的记录时间。当您访问日志的单个详细信息页面时,您可以看到更多消息,包括您传递给日志的所有上下文数据(作为数组)。“比挖掘原始文本文件稍微好一点。”。当您将上下文传递给数组中的日志条目时,您可以查看所有数据,查看触发它的请求,触发它的用户。“比挖掘原始文本文件稍微好一点。转储屏幕”这是我最喜欢的功能之一“如果您在代码中使用dump()函数,并且在Telescope中打开了转储屏幕。您可以在中看到转储Telescope不是来自您的实际应用程序。这为您提供了dd()样式的数据输出,而不会打乱您的正常页面加载。每个转储还链接到生成它的请求。如果您离开转储屏幕,您的所有转储都将突然又在浏览器上显示了Queries列出了所有数据查询的相关信息,就像调试栏一样。比如消费时间,完成查询,请求触发等。漂亮的格式化显示。可以在服务中配置慢的边界查询,一旦查询被勾选,其配置时间将被标记并显示红色警告。注意:每个列表页面都有快捷方式和快速搜索。搜索标签和其他内容。模型可以看到查询,更新,删除事件;和变化由这些事件等产生。Events显示所有事件的列表。可以通过标签查看哪些事件被广播;查看所有听众的列表,并深入了解被呼叫的人。Mail显示已发送的所有邮件列表;谁是收件人;什么时候发送的;他们是否仍在队列中,以及他们何时出队。您可以看到电子邮件主题,当您深入了解它时,您还会看到诸如MailTrap之类的内容。您甚至可以下载原始.eml文件并在选定的客户端中打开它。Notifications显示所有通知,它们的类型等。无法预览,因为有些通知是不可预览的,如果是电子邮件通知,您会在列表中看到它。如果通知已排队,也可以在作业的请求部分中看到。有很多方法可以获取这些数据。缓存显示缓存命中、未命中、更新等。显示键、值、过期时间。您可以看到触发它的请求,并且可以在请求页面上看到该请求的所有缓存命中/未命中。Redis类似于上面的缓存。例如花费了多长时间、发生的时间、发起请求的时间等。经过身份验证的用户在任一选项卡的条目上获取有关经过身份验证的用户的信息。授权可以在生产环境的Telescope服务中配置可访问的邮件账号列表。定义哪些用户可以访问Gate的viewTelescope中的过滤器。您可能不想在生产环境中保存所有内容,因此您可以在Telescope服务提供者中使用它,运行Telescope::filter(function($entry))。默认过滤器:function($entry){if(local){returntrue;}返回$entry->isReportableException||$entry->isfailedJob()||$entry->isScheduledTask()||$entry->hasMonitoredTag();}但是你可以随意修改。监视标签:单击雷达按钮以声明监视标签。您可以在UI界面中声明一个Auth:1监视器。请求没有记录在生产环境中,但是如果你有像Auth:1这样的监控器,你会看到所有请求都被记录下来,除非你取消监控。注意:如果您使用的是Redis队列,则Horizo??n和Telescope可以完美地协同工作。修剪Telescope中的任务调度程序会修剪掉过期的条目。您可以每晚删除早于__小时的内容。这也在config/telescope中设置。任何观察者都可以随时启用或禁用。例如。Watchers\CacheWatcher::class可以弃用。还有一个TELESCOPE_LIMIT,默认定义为100;这个选项的意思是一次执行100个查询,100个Redis查询等,都可以在env中配置。MiscellaneousTelescope可以在本地和生产环境中运行,并具有内置的授权和工具来保护私有数据。它可以从多个角度访问同一种数据,具有一系列配置项,并提供强大的标记和过滤功能。考虑将其放在单独的数据库中。泰勒后来在推特上提到,你可以添加过滤器以确保不记录私人数据。您可以使用Telescope::night()启用夜间模式(也许在服务提供商处?)问答:数据存储在哪里?隐藏在StorageRepository接口实现之后;就像Redis上的数据库一样工作。你可以随心所欲地做。这个接口只有6-7个方法。它可以存储多少数据?不能太多,因为生产环境几乎什么都扔掉,修剪掉,一次只能存100个。我们能收到Slack的通知吗?我们正在做这件事。我可以退出Bugsnag/etc.吗?可能不会。虽然它简单轻便,但并不意味着它稳定坚固。小心蜡烛。我们可以按时间戳过滤吗?还没有,不过这是一个开源项目,帮我们看看在系统启动阶段会有什么影响?一次只会执行一个查询。在生产环境中,并非所有东西都经常插入。您可以取消不关心的听众。我们可以在同一个UI中检查多个应用程序吗?是的;只需将它们指向并记录在同一个数据库中,然后考虑标记/过滤,以便您可以根据需要进行区分。它与哪个版本的Laravel兼容?5.7.7+。