runtime/log 目录运行时缺失需手动创建并赋权:执行 mkdir -p runtime/log,设 chmod -R 755 runtime 及正确属主,Windows 下添加 IIS_IUSRS 修改/写入权限,并检查部署流程是否清空该目录。

直接创建并赋权,不是配置问题,而是运行时路径缺失。
确认 runtime/log 目录确实不存在
不要只看项目结构里有没有这个文件夹——它本就不该被 Git 提交或随包分发。执行以下命令验证:
-
Linux/macOS:运行
ls -ld runtime/log,若提示No such file or directory,说明目录未生成 -
Windows(CMD/PowerShell):运行
dir runtime\log,同样会报错则确认缺失 - 更准的判断方式:
php -r "var_dump(is_dir('runtime/log'));",输出bool(false)即为不存在
手动创建完整路径并设置权限
ThinkPHP 不会自动创建多级目录(如 runtime/log),必须由你显式建立,且每级目录都需可进入、可写:
- 执行
mkdir -p runtime/log(Linux/macOS)或mkdir runtime\log(Windows) - 确保 runtime 及其所有父级目录(如项目根目录、www 目录等)都有
x(执行)权限,否则 PHP 进程无法遍历路径 - Linux 下设权限:
chmod -R 755 runtime;再设归属:chown -R www-data:www-data runtime(将www-data替换为你服务器实际的 Web 用户,如nginx或apache) - Windows IIS 环境下,右键 runtime 文件夹 → 属性 → 安全 → 编辑 → 添加
IIS_IUSRS并勾选“修改”和“写入”
检查是否被部署流程意外清空
很多 CI/CD 脚本或运维部署会执行 rm -rf runtime 或忽略该目录,导致每次上线后 log 子目录消失:
立即学习“PHP免费学习笔记(深入)”;
- 查看部署日志,确认是否有清理 runtime 的步骤
- 若使用 Docker,检查 Dockerfile 或 docker-compose.yml 是否挂载了 runtime,且挂载路径在容器内存在、UID/GID 匹配
- 可在部署脚本末尾加一句
mkdir -p runtime/log && chown -R $WEB_USER:$WEB_USER runtime自动补全
避免路径配置引发静默失败
如果 config/log.php 中设置了 'path' => 'log/error.log' 或其他自定义路径,要注意:
- 该路径是相对于
runtime/的,所以log/error.log实际对应runtime/log/error.log,仍需确保runtime/log存在 - 切勿在 path 中写动态路径如
log/{date('Ym')}/—— ThinkPHP 不解析 PHP 函数,会直接尝试写入字面路径,导致失败且无提示 - 推荐用绝对路径防歧义:
'path' => realpath(__DIR__ . '/../runtime/log/') . DS



















