ThinkPHP 5 日志默认不实时写入 runtime/log/,主因是目录权限不足、日志配置关闭或仅在请求结束时落盘;需优先检查 runtime 目录权限、log.enable 配置及 PHP 时区设置。

ThinkPHP 5 日志默认写不进 runtime/log/,不是你代码没报错,而是目录权限、配置级别或落盘时机卡住了——先确认这三处,再查内容。
日志文件在哪?先确认路径和生成条件
TP5 默认日志路径是 runtime/log/,但具体子目录结构取决于版本和配置:
- TP5.0.x 常见为
runtime/log/YYYYMM/dd.log(如runtime/log/202605/23.log) - TP5.1+ 更倾向
runtime/log/YYYY-MM-DD.log(如runtime/log/2026-05-23.log) - 若日志完全没生成,大概率是
runtime/目录不可写,或配置中'log' => ['enable' => false]被显式关闭 - 日志只在触发
Log::record()、发生未捕获异常、或app_debug = true时才写入,纯正常请求不会落盘
为什么 tail -f runtime/log/*.log 看不到实时输出?
因为 TP5 默认不开启实时刷盘,Log::record() 只存内存,等请求结束才调用 Log::save() 写文件。调试时容易误判“没日志”。
- 临时解决:在配置中启用
'realtime_write' => true(TP5.1+ 支持,TP5.0 需手动加Log::save()) - 更稳妥的开发习惯:用
Log::write('msg', 'error')替代Log::record(),它绕过内存缓存,直接落盘 - 注意:即使开了
realtime_write,若log.level只设了['error'],debug或sql日志仍不会出现
查不到错误?别只盯 runtime/log/
TP5 日志只记录框架内抛出的异常;白屏、500、空白响应这类问题,往往根本没走到框架层。
立即学习“PHP免费学习笔记(深入)”;
- 先看 PHP 错误日志:运行
php -i | grep "error_log"找到真实路径,通常是/var/log/php7.4-fpm.log或/var/log/apache2/error.log - 检查 Web 服务器日志:
tail -f /var/log/nginx/error.log,重点搜Fatal error、Segmentation fault、Permission denied - TP5 的
runtime/log/下如果连目录都没创建,说明runtime/所在磁盘满、挂载为只读,或 SELinux/容器 volume 权限拦截 - 用
ls -ld runtime确认属主是 Web 进程用户(如www-data),不是root
日志内容乱码或时间不对?重点看时区和编码
日志里的时间戳是 PHP date('Y-m-d H:i:s') 输出,默认用服务器本地时区,不是 UTC。
- 如果日志时间比实际晚 8 小时,大概率是服务器系统时区为 CST,但 PHP
date.timezone设成了UTC,改回Asia/Shanghai即可 - 日志文件本身是 UTF-8 编码,若用 Windows 记事本打开显示乱码,换 VS Code 或
less -r查看 - SQL 日志需额外开启:
'log' => ['sql' => true],且仅在app_debug = true时生效 - 日志行首的
[error]字段来自Log::error()调用,但自定义命令行任务中若没设置上下文,模块名可能为空或显示console
真正卡住排查进度的,从来不是日志格式或命令怎么敲,而是权限没对、时区设错、或者把 PHP 层崩溃当成应用逻辑错误去翻 runtime/log/ ——动手前,先 ls -ld runtime 和 php -i | grep timezone 两行命令,省掉八成无用功。



















