Laravel怎么配置日志_Laravel Logging系统使用教程【监控】

1次阅读

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

Laravel怎么配置日志_Laravel Logging系统使用教程【监控】

日志驱动选 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 时,tapvia 到底用哪个?

tap 是给现有 channel “加钩子”,via 是彻底接管日志创建逻辑——95% 的场景只需要 tap

  • tap 接收一个闭包,参数是刚实例化的 Monolog handler,适合加 formatter、Filter 或 context 注入
  • via 要返回一个完整 handler 实例,得自己 new RotatingFileHandler 等,容易漏掉 Laravel 默认的异常上下文(如 request id)
  • 常见误用:tap 里 return 东西——它不接受返回值,return 会被忽略
// 正确:在 tap 里修改 handler 属性 'tap' => [function ($handler) {     $handler->setFormatter(new MonologFormatterJsonFormatter()); }]

生产环境报 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 报错

Laravel 日志真正的复杂点不在配置语法,而在 channel 生命周期和 Monolog handler 的初始化时机——很多问题只在第一次写日志时暴露,且不报具体原因。动手前先确认 storage/logs/ 可写、磁盘有空、.env 里所有 env() 引用都已定义。

text=ZqhQzanResources