ThinkPHP日志膨胀问题可通过Logrotate实现自动轮转:需创建专属配置文件、验证语法与执行效果、同步调整框架日志参数、启用logrotate.timer定时任务,并可选Shell脚本替代方案。

如果您在使用ThinkPHP时发现runtime/log/目录下的日志文件持续增长、占用大量磁盘空间,则可能是由于缺乏有效的日志轮转机制。以下是针对ThinkPHP项目配置Logrotate实现日志自动轮转的具体操作步骤:
一、创建Logrotate专用配置文件
Logrotate通过独立的配置文件管理日志切割策略,需为ThinkPHP日志路径创建专属规则,确保轮转行为精准作用于目标文件,避免误切系统日志。
1、使用root权限在/etc/logrotate.d/目录下新建thinkphp配置文件:sudo nano /etc/logrotate.d/thinkphp。
2、写入以下内容(请将/var/www/html/your_project/runtime/logs/替换为实际项目中的LOG_PATH绝对路径):
立即学习“PHP免费学习笔记(深入)”;
/var/www/html/your_project/runtime/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 www-data www-data
sharedscripts
postrotate
/usr/bin/systemctl reload php8.1-fpm >/dev/null 2>&1 || true
endscript
}
二、验证并启用Logrotate配置
配置文件语法错误或权限问题会导致轮转失效,必须通过强制执行与调试输出双重验证,确认规则被正确加载和触发。
1、运行调试命令检查语法及匹配逻辑:logrotate -d /etc/logrotate.d/thinkphp。
2、手动强制执行一次轮转以验证效果:logrotate -f /etc/logrotate.d/thinkphp。
3、检查/var/www/html/your_project/runtime/logs/目录下是否生成带日期后缀的压缩归档(如2026-04-26.log.1.gz)以及新空日志文件。
4、确认新日志文件属主与属组为www-data:www-data(或Nginx/PHP-FPM实际运行用户),否则后续写入将失败。
三、同步调整ThinkPHP框架内日志参数
框架层配置与系统层Logrotate协同工作可避免重复记录、文件句柄冲突及磁盘空间浪费,尤其需限制单日志文件大小与最大保留数量。
1、打开项目配置文件config/log.php(TP6+)或config/app.php(TP5)。
2、定位'file'通道配置,在其中添加或修改以下键值:
'file_size' => 2097152,
'max_files' => 30,
'time_format' => 'Ymd',
3、确保'path'值与Logrotate中指定的路径完全一致,包括末尾斜杠与大小写。
4、保存后清空runtime/cache/缓存目录,使新配置生效:rm -rf runtime/cache/*。
四、设置Logrotate定时任务触发机制
Logrotate本身不主动轮转,依赖系统级定时任务驱动;Ubuntu默认通过cron.daily每日执行,但需确认其已启用且无权限拦截。
1、检查logrotate定时器状态:systemctl status logrotate.timer。
2、若显示inactive,启用并启动它:sudo systemctl enable --now logrotate.timer。
3、验证日志目录权限是否安全:若出现parent directory has insecure permissions错误,执行:chmod 755 /var/www/html/your_project/runtime/logs/。
4、确认父目录所属组为www-data或adm,且非world-writable(即不可为777)。
五、补充:使用Cron脚本实现轻量级轮转替代方案
当无法使用Logrotate(如容器环境或受限权限主机),可借助Shell脚本+crontab模拟基础轮转逻辑,适用于仅需按天归档与清理的场景。
1、创建清理脚本:sudo nano /usr/local/bin/rotate_thinkphp_logs.sh。
2、写入以下内容(替换/path/to/project为实际路径):
#!/bin/bash
LOG_DIR="/path/to/project/runtime/logs"
find "$LOG_DIR" -name "*.log" -mtime +30 -delete
gzip "$LOG_DIR/$(date -d "yesterday" +\%Y-\%m-\%d).log" 2>/dev/null
3、赋予执行权限:sudo chmod +x /usr/local/bin/rotate_thinkphp_logs.sh。
4、添加每日凌晨2点执行的crontab任务:echo "0 2 * * * /usr/local/bin/rotate_thinkphp_logs.sh" | sudo tee -a /etc/crontab。



















