log_channel应设为daily以平衡排查窗口与文件膨胀,修改需通过config/logging.php或.env中的log_channel,各通道level独立生效,logrotate路径须与配置严格一致。

LOG_CHANNEL 通常设为 daily,这是生产环境最稳妥的选择 —— 避免单文件无限膨胀,又保留足够排查窗口。
怎么改日志通道和级别?
别碰 config/app.php 里的旧配置(如 log 和 log_level),Laravel 5.6+ 已统一收口到 config/logging.php。
- 修改默认通道:在
.env中设LOG_CHANNEL=daily,或直接改config/logging.php的'default'键 - 调低日志量:把
'level' => 'debug'改成'level' => 'error'(尤其在生产环境) - 想只记录特定通道?用
Log::channel('my_custom')->info(...),不走默认链路
daily 驱动的几个关键参数
daily 看似简单,但 days、path、level 这三个参数一旦配错,就会出现“日志不生成”“旧日志没清理”“写入权限拒绝”等问题。
-
'days' => 14:控制保留多少天的日志文件(不是总文件数),值太小可能查不到历史问题 -
'path' => storage_path('logs/myapp.log'):路径必须可写,且目录存在;若改名,记得同步更新logrotate配置中的路径 -
'level' => 'info':该通道独立生效,和全局LOG_LEVEL无关;建议按通道职责分级,比如审计日志用notice,调试日志用debug
为什么不能只靠 .env 控制日志行为?
LOG_LEVEL=warning 只影响默认通道(stack 或你设的 LOG_CHANNEL),对显式调用的 Log::channel('xxx') 完全无效。
- 常见误判:
LOG_LEVEL=error后仍看到大量info日志 → 实际是代码里写了Log::channel('audit')->info(...) - 真正生效的是各 channel 自己的
'level'配置,.env中的LOG_LEVEL只作为 fallback - 多通道场景下,务必检查
config/logging.php里每个 channel 的level和driver
日志轮转要和 Laravel 配合着设
仅靠 Laravel 的 days 参数不够 —— 它只管“生成时删旧”,不管“磁盘满时强制切”。Linux 系统级轮转(logrotate)才是兜底手段。
-
/etc/logrotate.d/laravel中的路径必须和config/logging.php的path完全一致(包括通配符) -
rotate 14和 Laravel 的'days' => 14建议保持一致,否则会出现“Laravel 认为该删,logrotate 却没删”或反过来 - 测试命令必须带
-f(强制)和-v(详细输出):sudo logrotate -vf /etc/logrotate.d/laravel,光看返回码容易漏掉权限失败
daily)在 config/logging.php 里是键名,而 LOG_CHANNEL=daily 是告诉 Laravel “用这个键对应的配置”,二者必须严格匹配;大小写、拼写、多余空格都会导致静默回退到 stack 或报错。











