thinkphp项目上线后日志不记录错误,需确认日志驱动为file、error级别生效、runtime目录可写、app_debug=false、exception.php中log=true、清除runtime缓存,并配置shutdown钩子或php.ini捕获致命错误。

ThinkPHP项目上线后错误悄无声息,日志里找不到error记录,排查时连报错堆栈都看不到——这不是代码逻辑问题,而是日志没真正启动或错误根本没走日志通道。必须让error级别真实落盘、未捕获异常强制写入、致命错误也能留下线索。
确认日志驱动与错误级别是否生效
打开config/log.php,检查'default' => 'file'是否明确设置。若为''、'test'或'console',Log::error()调用会静默丢弃,不生成任何文件。
定位channels['file']数组,确认'level' => ['error', 'critical', 'alert', 'emergency']已显式声明。只写['error']足够,但绝不能漏掉'critical'——PHP致命错误触发的error_log()会映射为critical级别。
检查'close' => false。设为true等于关掉整个日志通道,框架不会报错也不会提示,日志目录空空如也。
【runtime/log/目录必须存在且www-data(或nginx)用户可写】。Linux下执行chown -R www-data:www-data runtime/,Windows需右键目录→属性→安全→编辑→添加IIS_IUSRS或Users写入权限。
关闭调试模式并启用异常日志捕获
第一步:在.env文件中确保两行配置存在且无空格:
APP_DEBUG=false
APP_ENV=production
第二步:打开config/exception.php,将'log' => true设为true。这个开关控制「未被捕获的异常」是否写入日志,和Log::error()是两条独立路径,缺一不可。
第三步:删除整个runtime/目录。缓存未清会导致旧配置残留,哪怕改了.env,日志仍不生成。
注意:APP_DEBUG=true时,所有异常直接输出到页面,Log::error()和exception.php的log机制全部被绕过,日志文件必然为空。
兜底捕获PHP致命错误
方法一:在public/index.php最顶部(define('APP_DEBUG', true)之前)插入shutdown钩子:
register_shutdown_function(function () {<br> $error = error_get_last();<br> if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {<br> $log = sprintf("[%s] %s in %s on line %d\n", date('Y-m-d H:i:s'), $error['message'], $error['file'], $error['line']);<br> file_put_contents(RUNTIME_PATH . 'log/fatal.log', $log, FILE_APPEND | LOCK_EX);<br> }<br>});
方法二:修改php.ini,确保三行同时生效:
log_errors = On
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
error_log = /var/log/php_fatal.log
【error_log路径不能是Web可访问目录】。比如设成/var/www/html/runtime/log/会导致攻击者直接下载日志,必须放在/var/log/等非Web根目录下。
验证日志是否真实写入
① 在任意控制器方法中插入:Log::error('test log write');
② 触发一次未捕获异常,例如在方法末尾写:throw new \Exception('unhandled test');
③ 执行一个语法错误,例如在app/common.php末尾加asdf(,然后刷新页面。
④ 检查三个位置是否有新增内容:
– runtime/log/日期.log里是否有[error]行
– runtime/log/fatal.log(若用了shutdown钩子)
– /var/log/php_fatal.log(若配了php.ini)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











