thinkphp异常日志不写入主因是app_debug=true或runtime/log/不可写;需设app_debug=false、log驱动为file、level为数组、close=false、目录可写且开启record_trace与trace。

ThinkPHP异常日志不写入,90%不是配置漏了,而是 APP_DEBUG = true 或 runtime/log/ 不可写。
APP_DEBUG 必须为 false 才能触发异常日志落盘
开发时设 APP_DEBUG=true,错误直接打屏,Log::error() 和异常处理器全被跳过;只有 APP_DEBUG=false 时,未捕获的 Throwable 才会进 app/exception/Handle.php 的 report() 方法,并由 config/exception.php 中的 'log' => true 控制是否写入日志。
-
.env文件里必须写成APP_DEBUG=false(等号前后不能有空格或引号) -
config/app.php里的'app_debug' => true会被.env覆盖,改它没用 - 临时验证:在入口加
echo config('app.app_debug') ? 'on' : 'off';,确认输出off
config/log.php 里三个关键项缺一不可
很多人只改 'level' => ['error'] 却没日志,是因为日志根本没写到文件——驱动没选对、通道关了、路径不存在。
-
'default' => 'file':必须是字符串'file',不是空值、'test'或null -
'channels' => ['file' => ['level' => ['error', 'critical']]:level必须是数组,写成字符串'error'会静默失效 -
'close' => false:全局和channels.file里都要检查,设成true就等于手动关掉整个日志系统 - 想固定日志名便于监控?加
'file' => 'log/error.log'到channels.file配置块里——注意这是相对于runtime/的路径
runtime/log/ 目录必须存在且 PHP 进程用户可写
报错 file_put_contents(runtime/log/20240512.log): failed to open stream: No such file or directory 不是 ThinkPHP 配置问题,是运行时路径缺失或权限不对。
- 部署时必须手动执行:
mkdir -p runtime/log && chmod -R 755 runtime(Linux) - 查 PHP-FPM 用户:
ps aux | grep php-fpm(通常是www-data或nginx) - 改归属:
chown -R www-data:www-data runtime(替换为你实际的用户) - 别用
777;755对目录、644对文件足够,但runtime必须可写
堆栈不完整?record_trace 和 trace 开关要开对
日志里只有 [ error ] msg 没文件、没行号、没上下文?不是日志没记,是堆栈开关被关了。
- 在
channels.file配置块里加'record_trace' => true(TP6.0+),不是顶层配置 -
'trace' => true也要开启(TP6.1+ 默认为false),该选项只对error和notice级别生效 - 开启后日志体积明显增大,线上建议只在排查期临时启用
- 别用
Log::write()记异常主体——它只记消息字符串;改用Log::info($e->__toString())才能输出完整堆栈
最易忽略的点:PDO 异常和 Fatal error 根本不走 ThinkPHP 日志流程,得在 public/index.php 顶部用 register_shutdown_function + error_get_last() 兜底,否则连第一条记录都没有。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











