如何限制Laravel日志文件大小 避免占满服务器存储空间
Laravel 5.8 日志容量控制方案(无需额外定时任务)
Laravel 5.8 日志底层基于Monolog实现,你可以直接通过修改日志配置实现日志按大小拆分、总容量限制,不需要额外编写cron任务,具体方案如下:
方案1:按大小自动拆分+固定保留份数(最常用)
通过配置自定义日志Channel,调用Monolog原生的RotatingFileHandler,可同时实现按大小拆分日志和自动清理过期日志,总占用空间可精准控制为「单文件上限 * 保留份数」,完全避免日志无限制增长。
操作步骤:
- 打开
config/logging.php,在channels数组中新增如下自定义Channel配置:
'size_rotate' => [ 'driver' => 'monolog', 'handler' => \Monolog\Handler\RotatingFileHandler::class, 'handler_with' => [ 'filename' => storage_path('logs/laravel.log'), 'maxFiles' => 30, // 最多保留30份日志,超出后自动删除最旧的文件 'maxFileSize' => 100 * 1024 * 1024, // 单文件最大100MB,超出后自动拆分新文件 'level' => \Monolog\Logger::WARNING, // 可按需调整最低记录级别,生产环境建议设为WARNING以上减少日志量 ], ],
- 修改项目根目录
.env文件中的日志驱动配置:
LOG_CHANNEL=size_rotate
- 重启队列、fpm等服务后生效。
方案2:新增日志去重逻辑(针对突发重复报错场景)
如果你的日志暴增多是因为同一报错短时间内重复打印,可以叠加Monolog的DeduplicationHandler,将指定时间窗口内完全相同的日志仅保留1份,可直接将突发日志量降低90%以上。
配置示例:
'deduplicated_size_rotate' => [ 'driver' => 'monolog', 'handler' => \Monolog\Handler\DeduplicationHandler::class, 'handler_with' => [ 'handler' => new \Monolog\Handler\RotatingFileHandler( storage_path('logs/laravel.log'), 30, \Monolog\Logger::WARNING, true, 0664, 100 * 1024 * 1024 ), 'time' => 60, // 60秒内相同日志仅存储1次 'level' => \Monolog\Logger::WARNING, ], ],
修改.env的LOG_CHANNEL为deduplicated_size_rotate即可生效。
额外优化建议
- 生产环境关闭debug模式,避免不必要的调试日志写入
- 接口请求、SQL查询这类高频日志,可按需单独配置独立的Channel和保留策略,避免和核心报错日志混写占用空间
内容的提问来源于stack exchange,提问作者Tal C
相关产品推荐
相关产品推荐

