ThinkPHP6按小时分割日志需自定义HourlyFileHandler类重写getMasterFileName()方法,生成形如2024-05-20-14.log的文件名,并在log配置中指定该处理器;历史文件需定时清理。

ThinkPHP6 默认日志按天分割,若需改为按小时分割,需自定义日志驱动或调整内置 File 日志处理器的行为。核心在于重写日志文件名生成逻辑,让其包含 年-月-日-小时(如 2024-05-20-14.log),并确保写入时自动切换文件。
修改日志配置,启用自定义处理器
在 config/log.php 中,不使用默认的 FileHandler,改用自定义类:
'default' => 'hourly',
'channels' => [
'hourly' => [
'type' => 'custom',
'path' => runtime_path('log'),
'level' => 'info',
'handler' => app\common\log\HourlyFileHandler::class,
'formatter' => \think\log\formatter\Simple::class,
],
],
创建 HourlyFileHandler 类
在 app/common/log/HourlyFileHandler.php 中继承 \think\log\driver\File,重写 getMasterFileName() 方法:
namespace app\common\log;
use think\log\driver\File;
class HourlyFileHandler extends File
{
protected function getMasterFileName(): string
{
$date = date('Y-m-d-H');
return $this->path . $date . '.log';
}
}
该方法决定当前写入的日志主文件名,Y-m-d-H 确保每小时生成独立文件(如 2024-05-20-14.log)。
避免手动清空或覆盖旧文件
TP6 的 File 驱动默认会追加写入,无需额外处理;但要注意:
- 日志轮转不自动清理历史小时文件,需配合定时任务(如 Linux cron)定期删除 72 小时前的日志;
- 若并发高,多个请求可能同时触发文件切换,但 PHP 的
fopen(..., 'a')是线程安全的,不会损坏内容; - 不建议修改
max_files或time_format等原生参数来“模拟”小时分割,效果不可靠。
验证是否生效
调用一次日志记录后,检查 runtime/log/ 目录下是否生成形如 2024-05-20-15.log 的文件,并在整点后观察新文件是否创建:
Log::info('test hourly log');
注意:日志文件切换发生在首次写入新小时时,不是整点自动创建空文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











