绝大多数项目该用 stack,因其天然支持多通道写入,如同时写文件和 slack;single 仅适合极简调试,扩展性差;laravel 9+ 已弃用 app_log 环境变量切换驱动。

日志驱动选 stack 还是直接用 single?
绝大多数项目该用 stack,不是因为它“高级”,而是它天然支持多通道写入——比如同时往文件和 Slack 发错误,或者开发环境只打屏、生产环境写文件+发告警。直接硬切 single 容易卡死在后续扩展上。
-
stack是 Laravel 日志的默认驱动,配置在config/logging.php的'default'键里 -
single适合极简调试,但一旦要加日志级别过滤、异步写入或转发到第三方,就得重配stack+ 多个 channel - 别改
APP_LOG环境变量来切驱动——Laravel 9+ 已弃用这个旧方式,改了也不生效
daily channel 的保留天数怎么真正生效?
设了 'days' => 7 却发现旧日志没删?问题常出在没触发日志轮转时机,或权限不对。
- 轮转只发生在新日志写入时:当天第一个
Log::error()才会检查并清理 7 天前的文件 - 确保
storage/logs/目录对 Web 服务器用户(如www-data)可写,否则daily会静默失败 - 手动清理可用
php artisan log:clear(Laravel 9.20+),但注意它清的是整个logs/目录,不区分 channel
自定义 channel 时,tap 和 via 到底用哪个?
tap 是给现有 channel “加钩子”,via 是彻底接管日志创建逻辑——95% 的场景只需要 tap。
-
tap接收一个闭包,参数是刚实例化的 Monolog handler,适合加 formatter、filter 或 context 注入 -
via要返回一个完整 handler 实例,得自己 newRotatingFileHandler等,容易漏掉 Laravel 默认的异常上下文(如 request id) - 常见误用:
tap里 return 东西——它不接受返回值,return 会被忽略
// 正确:在 tap 里修改 handler 属性
'tap' => [function ($handler) {
$handler->setFormatter(new \Monolog\Formatter\JsonFormatter());
}]
生产环境报 Unable to create configured logger 怎么快速定位?
这错误不告诉你具体哪错了,本质是 Monolog 初始化失败,优先查三处。
- 路径权限:
storage/logs/是否存在?Web 用户是否有写权限?用ls -ld storage/logs看 - 磁盘空间:
df -h看/var/www所在分区是否满,满会导致 fopen 失败 - 配置语法:
config/logging.php里 channel 定义是否用了未定义的变量?比如写了'path' => storage_path('logs/' . env('LOG_FILE_NAME')),但LOG_FILE_NAME没在 .env 里设,结果 path 变成logs/,末尾斜杠会触发 Monolog 报错
storage/logs/ 可写、磁盘有空、.env 里所有 env() 引用都已定义。









