thinkphp7日志未生成或写不进文件,主因是log.driver非file、log.path不存在、php进程用户无runtime/log写权限或log.level过高;需确认driver为file、level≤info、path为绝对路径且目录存在可写、属主与权限正确,并可通过log::info()测试及realtime_write验证落盘。

ThinkPHP7项目部署后日志没生成或写不进文件,常见原因是log.driver被设成stdout、log.path路径不存在、PHP进程用户对runtime/log目录无写权限,或是log.level级别太高导致info以下日志被过滤。
确认日志驱动为file并设置最低记录级别
打开config/log.php文件,找到'driver'配置项,确保其值为'file'而非'stdout'或'test';同时将'level'设为'debug'或'info'——线上环境若只设'error',Log::info()这类调用会被直接丢弃,看起来像“日志失效”。
【log.level必须≤info才能记录Log::info()】
检查多应用模式下是否覆盖了主配置:若项目启用多应用,需进入对应应用目录(如app/api/config/log.php)单独修改,主配置可能完全不生效。
强制指定绝对路径并验证目录结构
在config/log.php中将'path'改为绝对路径,例如:
'path' => '/var/www/myapp/runtime/log/'
注意结尾不能带双斜杠,否则路径拼接会出错;更稳妥的做法是用realpath动态生成:
'path' => realpath(__DIR__ . '/../runtime/log/') . DIRECTORY_SEPARATOR
执行命令检查该路径是否存在且可写:
ls -ld /var/www/myapp/runtime/log
如果提示“No such file or directory”,说明目录未创建,需手动建好:
mkdir -p /var/www/myapp/runtime/log
修正PHP进程用户与目录属主权限
第一步:确认PHP实际运行用户。新建check_user.php,内容为:
通过浏览器访问该文件,记下输出用户名(如www-data、nginx或apache)。
第二步:将runtime及其所有父级目录属主设为该用户:
sudo chown -R www-data:www-data /var/www/myapp/runtime
第三步:确保每级目录都有x权限(否则无法cd进入):
sudo chmod -R 755 /var/www/myapp/runtime
【runtime/log目录权限必须是755,不是644】
第四步:清除日志缓存并重启服务:
php think clear:log
验证日志是否真正落盘
方法一:用Log::info()触发写入
在控制器中写一行测试代码:Log::info('日志测试', ['time' => date('c')]);
刷新页面后,立即检查runtime/log/目录下是否生成当天日期命名的.log文件(如2026-07-21.log)。
方法二:关闭缓冲强制实时写入
在config/log.php中添加'realtime_write' => true,避免因缓冲机制掩盖写入失败问题。
方法三:临时禁用日志轮转排查
将'max_files'设为0,观察是否固定写入单个文件——若能成功,说明原配置中轮转逻辑触发了权限校验失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











