线上日志不落盘90%因app_debug=true或runtime/log/不可写:app_debug必须为false才能触发错误日志写入,且需确保channels.file.path正确配置、目录存在并可写。

线上环境日志不落盘,90% 是因为 APP_DEBUG=true 或 runtime/log/ 不可写,不是配置项没填全。
APP_DEBUG 必须为 false 才能触发错误日志写入
ThinkPHP 6 的致命错误(Fatal error、Parse error)根本不会进 Log::error() 流程——它们由 PHP 自身的 register_shutdown_function 捕获,而 ThinkPHP 只在 APP_DEBUG === false 时才注册这个钩子。
-
APP_DEBUG=true(开发模式):错误直接渲染到页面,runtime/log/里几乎没内容 -
APP_DEBUG=false(生产模式):错误走异常处理器,再由config/exception.php中的'log' => true控制是否写入日志 - .env 文件里必须写成
APP_DEBUG=false(无空格、无引号),Nginx/Apache 要显式透传该变量
config/log.php 的关键参数不是 level,而是 channels.file.path 和 close
很多人改了 'level' => ['error'] 却没效果,是因为日志根本没写到文件——channels.file.path 默认为空,实际路径会 fallback 到 runtime/log/,但该目录可能不存在或无权限。
-
'path' => ''表示用默认路径;若想固定为runtime/log/error.log,应设为'path' => 'log/error.log'(注意是相对于runtime/) -
'close' => true会全局禁用日志,务必确认是false -
'single' => true可避免按日期分文件,方便监控脚本读取,但需手动确保文件可写 - 别在
path里写date('Ym')这类动态路径——ThinkPHP 不自动创建多级目录,静默失败
404 错误不进日志?检查 ignore_404 和异常处理器开关
HTTP 404 属于异常,不是 PHP 错误,它走的是 think\exception\HttpException 流程,是否记录取决于两个地方:
-
config/log.php中'ignore_404' => false(默认就是 false,但有人手抖改成 true) -
config/exception.php中'log' => true(控制所有未捕获异常是否写日志,包括 404) - 如果用了自定义异常处理器,要确保它调用了
parent::report($exception),否则日志链路中断
file_put_contents 失败报 “No such file or directory” 怎么办
这不是 ThinkPHP 配置问题,是运行时权限或路径缺失:
- 先确认
runtime/目录存在且 Web 用户(如 www-data、IIS_IUSRS)有写权限:chmod -R 755 runtime/(Linux) - 检查
runtime/log/是否被 gitignore 或部署脚本删掉——有些 CI/CD 会清空 runtime - 用
php -r "var_dump(is_writable('runtime/log'));"直接验证可写性 - 如果用 Docker,确保 volume 挂载正确,且容器内用户 UID 匹配宿主机目录权限
最常被忽略的一点:日志文件名带日期(如 20260506.log),排查问题时容易找错“最新”文件——建议线上固定用 single => true + 显式 path,把日志收敛到单个文件,和监控系统对齐。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











