Laravel 按天生成日志需使用 daily 驱动并显式配置 path(如 '/var/log/myapp/laravel.log'),该路径为带 .log 后缀的基础文件路径,日期后缀由 RotatingFileHandler 自动添加;LOG_CHANNEL 必须设为 daily,且确保 Web 服务器用户有写权限。

想让 Laravel 按天生成日志文件(比如 laravel-2026-05-06.log),不能只改 LOG_CHANNEL=daily 就完事——必须确认驱动、路径、日期变量三者协同生效,否则仍会写进单个大文件或报错找不到目录。
daily 驱动必须显式配置 path 才能自定义存储位置
daily 驱动默认仍走 storage_path('logs/laravel.log'),但它的文件名是带日期后缀的(如 laravel-2026-05-06.log)。如果你要存到非默认路径(比如 /var/log/myapp/),必须在 config/logging.php 的 daily 通道里明确写死 path:
'daily' => [
'driver' => 'daily',
'path' => '/var/log/myapp/laravel.log', // ← 这里必须是完整路径+文件名,.log 后缀不能少
'level' => 'debug',
'days' => 14,
],
-
path值不是目录,而是「基础日志文件路径」;Laravel 会自动在后面拼上-YYYY-MM-DD后缀 - 确保 Web 服务器用户(如
www-data或nginx)对该路径有写权限,否则日志静默失败 - 如果路径含变量(如
date('Y-m')),daily驱动不支持——它只认固定路径,日期逻辑由内部处理
别用 single 驱动配日期变量,它根本不解析时间占位符
有人试过把 single 的 path 写成 storage_path("logs/laravel-".date('Y-m-d').".log"),结果发现每天还是只写一个文件,且日期不会更新。这是因为:
-
single驱动初始化时只执行一次path计算,之后全程复用该路径 - 它没有轮转逻辑,也不会按天新建文件,
date()调用只在服务启动时跑一次 - 强行用
single实现“按天分割”,实际是靠外部脚本或 cron 搬移文件,不推荐
days 参数控制清理,但不决定是否按天切分
days 只影响旧日志的自动删除行为,和“是否按天生成新文件”无关。只要用了 daily 驱动,每天零点就会自动创建新文件;days 是后续清理的阈值:
-
'days' => 7:最多保留最近 7 天的日志文件(如今天是 5 月 6 日,就删掉 4 月 29 日及更早的) - 该清理发生在每次写入日志前,由
RotatingFileHandler触发,不需要额外配置 cron - 若设为
0,则不清理任何历史文件——注意磁盘空间
环境变量 LOG_CHANNEL 必须设为 daily,且不能被其他配置覆盖
最常见踩坑点:改了 config/logging.php 里的 daily 配置,但 .env 里仍是 LOG_CHANNEL=stack,或者 stack 通道里没包含 daily:
- 检查
.env:确保是LOG_CHANNEL=daily,不是stack或single - 如果坚持用
stack,必须把它channels数组里加上'daily',否则stack不会转发日志过去 - 运行
php artisan config:clear后再测,缓存不刷新会导致配置不生效
真正关键的是:daily 驱动的日期逻辑藏在 Monolog 的 RotatingFileHandler 里,它只认你给的 path 基础路径,然后自己拼后缀——所以路径写错、权限不对、驱动没切过去,都会导致“看似配了 daily,实则还在狂写单个大文件”。











