要让thinkphp项目出错时留下线索并及时告警,需三步:一是正确配置log.php中file通道的level、ignore_404等参数并确保runtime/log可写;二是线上关闭app_debug=false且开启exception.php中log=true,使致命错误和未捕获异常落盘;三是集成sentry实现主动告警,通过入口初始化或自定义异常处理器上报。

刚上手 ThinkPHP,想让项目出错时能留下线索、及时知道问题?关键不是“开了日志就行”,而是让错误真正落盘、关键异常不漏报。下面直接说清楚怎么做,不绕弯。
日志配置:确保 error 级别真能写进文件
ThinkPHP 6+ 的日志主配置在 config/log.php,不是 app.php 或中间件里。默认配置看着像开了,但几个参数不调对,error 日志可能根本不会生成。
- 'default' => 'file':必须明确设为 file,不能是空或 test
- 'level' => ['error']:写在 channels['file'] 里,表示只记录 error 及以上级别(critical、alert、emergency)
- 'ignore_404' => false:如果希望 404 错误也进日志,这个要关掉(默认就是 false)
- 'close' => false:千万别设成 true,否则整个日志通道被关闭
- 路径权限要到位:runtime/log/ 目录必须存在,且 Web 服务器用户(如 www-data 或 nginx)有写权限。Linux 下可执行:chown -R www-data:www-data runtime/log && chmod -R 755 runtime/log
致命错误为啥没日志?因为它们“跳过”了框架
PHP 的 Parse error、Fatal error、未 catch 的 TypeError,发生在框架启动前,ThinkPHP 的 Log::error() 根本执行不到。这类错误靠的是 PHP 自身的 register_shutdown_function,而 ThinkPHP 默认已注册——但前提是 APP_DEBUG = false。
- 开发时开 APP_DEBUG=true,错误直接打屏,不写日志
- 线上务必在 .env 中设 APP_DEBUG=false
- 同时检查 config/exception.php 中
'log' => true是否开启,它控制未捕获异常是否记日志
Sentry 集成:让错误“主动找你”
日志得人去看,Sentry 能自动告警。它不替代日志,而是把关键异常实时推给你(邮件、Slack、钉钉等)。
-
安装 SDK:ThinkPHP 6/8 推荐用官方 sentry/sdk:
composer require sentry/sentry - 初始化位置:在应用入口(如 public/index.php)或全局中间件中 init,DSN 从 Sentry 后台项目设置页复制
-
基础初始化示例:
use Sentry\SentrySdk; use Sentry\ClientBuilder; SentrySdk::init(function (ClientBuilder $builder) { $builder->setDsn('https://xxx@oxxx.ingest.sentry.io/xxx'); $builder->setEnvironment($_ENV['APP_ENV'] ?? 'production'); }); -
自定义异常处理(更推荐):TP8 可在 app/common/exception/Sentry.php 中继承 Handle 类,在 render 方法里调用
$sentry->captureException($e),这样所有未捕获异常都会上报
实用小技巧:让日志和监控更好用
-
固定日志文件名:改 config/log.php 中
'file' => 'log/error.log',避免按日期生成多个文件难排查 -
别用动态目录:如
'path' => runtime_path('log') . date('Ym'),ThinkPHP 不会自动创建多级目录,静默失败 -
主动上报非异常信息:比如支付成功、关键操作完成,用
Sentry\captureMessage('payment success', ['order_id' => 123]) -
加面包屑:在关键流程前调用
Sentry\addBreadcrumb(...),能还原用户出错前的操作路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











