ThinkPHP6.1默认File日志驱动不支持单文件大小限制,需通过logrotate(方式一)或自定义SizeRotatingFile驱动(方式二)实现5MB自动轮转,后者需注意并发锁与clearstatcache。

ThinkPHP6.1 默认使用 think\log\driver\File 日志驱动,但不内置单文件大小滚动限制功能。它按日期生成日志(如 2026-10-29.log),不会自动按体积切分。要实现「单个日志文件不超过指定大小」(例如 5MB),需手动配置日志驱动参数或替换为支持 size-based rotate 的驱动。
以下是两种切实可行、生产环境验证过的方式:
✅ 方式一:启用 max_files + time_format 配合定期归档(轻量推荐)
TP6.1 的 File 驱动虽不支持 max_size,但可通过组合参数间接控制单日志体量:
- 设置
max_files => 1:强制每天只保留一个日志文件(避免按小时/分钟分裂出大量小文件) - 配合
time_format => 'Y-m-d'(默认即如此),确保每天一个文件 - 再通过系统级 logrotate 管理(更可靠、不侵入 PHP):
# /etc/logrotate.d/thinkphp
/path/to/runtime/log/*.log {
daily
maxsize 5M
rotate 30
compress
missingok
notifempty
}
✅ 优点:零代码修改、资源占用低、符合运维规范;❌ 缺点:需服务器有 root 权限或可配 cron。
✅ 方式二:自定义日志驱动(精准可控,适合容器/无 root 环境)
继承 think\log\driver\File,重写 write() 方法,加入文件大小检查与自动轮转逻辑:
// app/common/log/SizeRotatingFile.php
namespace app\common\log;
use think\log\driver\File as BaseFile;
class SizeRotatingFile extends BaseFile
{
protected $maxFileSize = 5242880; // 5MB
public function write($message, $level = 'info', $type = 'error')
{
$filename = $this->getLogFileName();
if (is_file($filename) && filesize($filename) >= $this->maxFileSize) {
$newName = dirname($filename) . '/' . pathinfo($filename, PATHINFO_FILENAME)
. '_' . date('His') . '.log';
rename($filename, $newName);
}
return parent::write($message, $level, $type);
}
}
然后在 config/log.php 中注册:
'default' => 'size_rotate',
'channels' => [
'size_rotate' => [
'type' => \app\common\log\SizeRotatingFile::class,
'max_files' => 0, // 关闭日期轮转,交由自定义逻辑处理
],
],
✅ 优点:完全自主控制、无需外部依赖;⚠️ 注意:
rename()在高并发下需加锁(可用flock()简单防护),否则可能丢日志。
⚠️ 补充提醒
- 不要依赖
file_size或size类似字段——TP6.1 原生 File 驱动没有该配置项,设了也无效 -
runtime/log/目录必须可写,且 PHP 进程有权限创建/重命名文件 - 若用 Swoole 或常驻进程,需注意日志句柄未释放导致
filesize()返回旧值,建议每次write()前clearstatcache(true, $filename)
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











