Telescope 数据不显示的主因是环境配置、Watcher 开关和数据库迁移三者未正确协同:APP_ENV 必须为 local 且 APP_DEBUG=true;config/telescope.php 中 QueryWatcher 等需设为 true;必须执行 php artisan migrate 创建 telescope_entries 表。

Telescope 路由能打开、界面有内容,但关键数据(比如 SQL 查询、队列任务、日志)不显示?不是装得不对,是默认只开了一半功能,且强依赖环境判断和显式配置。
为什么 /telescope 页面空或部分标签没数据
常见现象:Requests 标签能看到请求,但 Queries、Jobs、Logs 里一条都没有;或者点了请求详情,下方 Queries 区域空白。
-
APP_ENV必须是local(不能是dev、staging或空值),APP_DEBUG=true也必须同时满足 -
config/telescope.php中对应 watcher 的键值为false,例如'Laravel\Telescope\Watchers\QueryWatcher' => false—— 默认 Laravel 10+ 是true,但 Laravel 11+ 安装后可能被重置为false - 漏执行
php artisan migrate:表telescope_entries缺失会导致写入静默失败,界面无报错但数据不存 - Laravel 11+ 需确认
App\Providers\TelescopeServiceProvider::class已显式注册在config/app.php的providers数组中(自动发现默认关闭) - 用
php artisan route:list | grep telescope验证路由是否注册;无输出说明服务提供者根本没加载
如何确认 QueryWatcher 和 JobWatcher 真正在工作
别只刷页面等结果,直接验证采集链路是否通:
- 在
config/telescope.php的watchers数组里,确认'Laravel\Telescope\Watchers\QueryWatcher'和'Laravel\Telescope\Watchers\JobWatcher'值为true - 临时加一行测试代码:
Telescope::recordMessage('query-test', 'debug');,然后刷新/telescope→ Messages 标签页,能看见说明 Telescope 基础写入正常 - 手动触发一个查询:
User::where('id', 1)->first();,再立刻进php artisan tinker执行DB::getQueryLog()确认 SQL 确实发出了;如果 tinker 能打出,但 Telescope 里没有,基本锁定是QueryWatcher被 ignore 规则过滤(如设置了'prefixes' => ['test_']却查的是users表) - 队列任务要确保驱动不是
sync(同步模式下 Telescope 捕不到),且任务已真正 dispatch(非dispatchSync())
绑定参数不显示、SQL 显示不全的真正原因
不是配置漏了,是 Telescope 的记录机制和 SQL 类型共同决定的:
- 绑定参数只在预处理语句中生效:
DB::table('users')->where('id', $id)->get()这类会记录参数;而DB::select("SELECT * FROM users WHERE id = $id")是字符串拼接,Telescope 只记录原始语句,无参数可绑 - QueryWatcher 默认忽略元数据查询(如
SHOW TABLES、PRAGMA),这不是 bug,是设计行为 - 大响应体或长 SQL 被截断?检查
config/telescope.php中RequestWatcher的'size_limit' => 64,可调大到1024(单位 KB) - 想看完整 SQL + 参数,必须点进单条请求详情页的 Queries 子 tab —— 首页的“Queries”汇总只是入口,不展开看不到绑定值
生产环境误启用 Telescope 的后果比想象中严重
它不是“低采样率监控”,而是“全量请求快照记录器”,一旦启用就停不下来:
- 每条请求都存完整
request->all()、response->content()、所有 SQL 绑定参数、调用栈、中间件顺序——高并发下数据库写入压力陡增,内存暴涨 -
TELESCOPE_ENABLED=true在.env里设了也没用,因为config/telescope.php的enabled闭包默认只返回$request->isLocal(),靠环境变量控制不可靠 - 最稳妥的做法:上线前删掉
composer require laravel/telescope(或至少移除--dev),并从config/app.php中彻底注销TelescopeServiceProvider - 如果真要在预发环境灰度,不要改
enabled,而是用ignore规则做路径级过滤,例如只记录/api/v1/orders相关请求
Telescope 的核心价值不在“开了就能看到”,而在“精准控制哪些行为该被记录、在哪种条件下才触发”。很多问题其实出在 watcher 开关、环境判定、迁移缺失这三处,而不是功能本身失效。


















