异常上报应聚焦未捕获throwable、自定义业务异常及中间件/cli错误三类,避开validateexception等预期异常;report()专责日志与上报,render()专责响应输出;需结构化记录请求、用户、资源上下文并脱敏敏感字段;按严重程度分级上报,配置熔断与大小限制。

明确异常上报的触发边界
不是所有异常都要上报,重点监控三类情况:未捕获的 Throwable、业务主动抛出的自定义异常(如 BusinessException)、以及中间件/命令行中绕过控制器生命周期的错误。TP6.1 默认只对 Exception 子类做日志记录,Error 类型(如 FatalError)需在 report() 方法中显式处理。避免把验证失败(ValidateException)、404、405 这类预期异常纳入上报,它们应走统一响应出口而非告警通道。
分离 report() 与 render() 职责
report() 只负责日志写入和第三方上报,不参与响应构造;render() 只负责格式化输出,不执行网络请求或耗时操作。在 app/exception/Handler.php 中:
- 重写
report():判断是否为需上报异常(例如非HttpException且非白名单类),调用Log::channel('sentry')->error()或封装 HTTP 客户端直报 Sentry / 阿里云ARMS - 重写
shouldReport():对调试环境(app()->isDebug())返回false,避免开发期刷爆日志;对已知业务异常(如IdempotentException)也返回false - 确保
$dontReport数组包含常见非错误类,如ValidateException::class、TokenExpiredException::class
结构化日志 + 上下文增强
上报内容不能只有堆栈,要带可定位上下文:
- 请求维度:记录
$request->method()、$request->url()、$request->header('x-request-id')(建议用中间件注入) - 用户维度:若已登录,追加
user_id和role;CLI 命令则记录$argv - 资源维度:数据库慢查询自动附加
Db::getQueryTime()和 SQL 片段(脱敏后) - 生产环境强制过滤敏感字段:
password、token、card_no等键名值一律替换为[REDACTED]
分级上报与降级策略
避免单点故障导致日志丢失或拖垮主服务:
- 高频低危异常(如参数校验失败)走异步队列(Redis List + 消费脚本),不阻塞响应
- 严重异常(500、DB 连接失败、Redis 不可用)同步直报,并触发本地磁盘落盘(
storage/logs/fatal/) - 配置熔断开关:当上报接口连续 5 次超时或返回 5xx,自动切换至本地文件暂存,30 分钟后重试
- 限制单条日志大小(≤128KB),超长堆栈截断并标记
... [TRUNCATED]
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











