ThinkPHP 错误日志默认写入 runtime/log/ 目录,TP6/8 按日期分文件如 2026-03/16.log,TP5 多为 error.log 或 think.log;需检查目录权限、log.php 的 level 配置、realtime_write 设置,并结合 PHP 和 Web 服务器日志交叉分析。

ThinkPHP 应用错误日志默认在哪
ThinkPHP 6/8 的错误日志默认写入 runtime/log/ 目录,按日期分文件,比如 runtime/log/2026-03/16.log;TP5 可能是 runtime/log/error.log 或 runtime/log/think.log,但路径结构已统一向日期分割靠拢。
关键不是“有没有 log”,而是“有没有被写进去”——常见现象是目录空空如也,或日志停在某天不再更新。这通常不是框架没记录,而是权限或配置卡住了落盘环节。
-
runtime/及其子目录必须对 Web 进程用户(如www-data、nginx或apache)可写,否则日志直接静默丢弃 - 检查
config/log.php中的level配置,若只设了['error'],那warning和debug就不会落地,容易漏掉前置征兆 - 确认
default渠道是否启用realtime_write => true,否则日志可能缓存数秒甚至更久才刷盘,调试时会误判“没报错”
怎么实时盯住最新错误输出
别等出问题再翻历史,开发或上线初期建议直接 tail -f 跟着看,尤其改完配置或上线新接口后。
最实用的一行命令是:tail -f runtime/log/$(date +%Y-%m)/$(date +%d).log,它自动拼出当天日志路径,避免手动输错月份或日期。
立即学习“PHP免费学习笔记(深入)”;
- 如果
runtime/log/下没有按月分目录,说明日志驱动没走 File,默认 fallback 到单文件(如think.log),此时用tail -f runtime/log/*.log更稳妥 - 遇到 “No such file or directory” 错误,先
ls -l runtime/log看是否存在,再stat runtime/log检查属主和权限 - 某些部署用了容器或 SELinux(如 CentOS),即使权限看着对,也可能被安全策略拦截写入,需额外检查
sestatus或容器 volume 挂载方式
PHP 层和 Web 服务器日志必须交叉对照
ThinkPHP 日志只记录框架内抛出的异常,而 PHP 解析失败、内存溢出、扩展缺失、FPM worker crash 这类底层错误,根本进不了框架,只会出现在 PHP 或 Nginx/Apache 的日志里。
典型场景:页面白屏无任何 ThinkPHP 日志 → 八成是 PHP fatal error,去 /var/log/php8.1-fpm.log 或 /var/log/nginx/error.log 找 Fatal error: 或 segmentation fault。
- PHP 错误日志路径由
php.ini的error_log决定,运行php -i | grep "error_log"最快确认实际位置 - Nginx 的
error_log默认级别是error,但 PHP 的warning不会打进来;要看到 PHPnotice,得调高 Nginx 的error_log级别或依赖 PHP 自身日志 - Apache 用户注意:
/var/log/apache2/error.log有时会混入 mod_rewrite 失败、.htaccess 权限拒绝等非 PHP 错误,别一概当成代码问题
为什么开了 APP_DEBUG = true 还看不到错误详情
开启调试模式只是让框架把错误渲染到页面底部或返回 JSON,但它不等于“所有错误都记录进日志”,也不代表“PHP 错误显示开关已打开”。
常见断点:入口文件 public/index.php 里虽有 define('APP_DEBUG', true),但 PHP 的 display_errors 仍为 Off,导致语法错误、未定义变量等 Parse/Fatal 类错误直接 500 白屏,连框架都加载不到。
- 临时验证:在
public/index.php顶部加两行:ini_set('display_errors', 'On'); ini_set('error_reporting', E_ALL);,立刻能看到原始报错 -
APP_DEBUG = true会激活 SQL 日志(需config/database.php中trigger_sql => true),但若数据库连接根本失败,SQL 日志也不会生成 - 线上环境禁用
APP_DEBUG后,务必确保config/log.php的level至少保留['error', 'warning'],否则等于关掉了故障监听器
真正难排查的问题,往往横跨三层:PHP 解析层报错 → FPM 进程退出 → Nginx 返回 502。日志不在一个地方,也不能只看一个地方。


















