日志级别由各channel的level配置决定,log_level仅在未显式设置时兜底生效;不同driver对level处理逻辑不一致,需按channel单独配置合法字符串值如'error'。

日志级别不是靠改 LOG_LEVEL 环境变量就能全局生效的——它只控制默认 channel 的最低记录阈值,而每个 channel 可以独立设 level,且实际生效还取决于 driver 行为。
config/logging.php 里每个 channel 的 level 才是真正起作用的地方
比如你配置了 daily 通道但没写 level,它会继承默认值(通常是 debug),但如果你在 stack 里嵌套了 daily 和 slack,那 slack 的 level 得单独设,否则错误发不出去。
-
level值必须是字符串,如'error'、'warning',不能写LogLevel::ERROR或数字 - 常见合法值:
'debug'、'info'、'notice'、'warning'、'error'、'critical'、'alert'、'emergency' - 如果某个 channel 的
level设成'error',那Log::warning('xxx')就不会写入该 channel,哪怕你调用的是Log::warning
LOG_LEVEL 环境变量只影响默认 channel 的 fallback 行为
Laravel 9+ 已弃用通过 APP_LOG_LEVEL 控制日志级别,现在只认 LOG_LEVEL,但它仅在 config/logging.php 中对应 channel 没显式声明 level 时才兜底生效。一旦你写了 'level' => 'error',环境变量就完全失效。
- 不要在
.env里写APP_LOG_LEVEL=error—— 这个键名早就不被读取了 - 正确写法是
LOG_LEVEL=error,但仅当 channel 配置里没设level才管用 - 开发时想快速切级别?直接改
config/logging.php对应 channel 的level更可靠
不同 driver 对 level 的处理逻辑不一致
比如 single 和 daily 驱动会严格按 level 过滤;但 stderr 或 syslog 在某些系统上可能忽略 level,直接把所有消息转给系统日志服务;slack 则默认只传 error 及以上,除非你手动覆盖 level 并配好 tap 处理器。
-
stack本身不处理日志,它只是分发器——每个子 channel 的level各自生效 - 用
monolog自定义 driver 时,level可能被 Monolog 的处理器逻辑二次过滤,得看具体 handler 实现 - 测试是否生效?别只看
storage/logs/laravel.log,要确认你调用的是哪个 channel:Log::channel('daily')->error('test')
最容易被忽略的一点:日志级别是「写入门槛」,不是「触发条件」。写一条 info 日志,不会自动触发 error 通道的任何行为——每个 channel 完全独立判断是否接收这条消息。配置错一个 level,关键告警就静默了。











