laravel日志真正可用需串联通道、驱动、路径、权限与环境变量:single适合开发但须确保default设为single且path可写;daily生产推荐,需配days控制保留天数并检查storage/logs权限;stack聚合多通道时要避免名称错位和静默失效。

想让 Laravel 日志在部署后真正可用,关键不是改几行代码,而是把通道、驱动、路径、权限和环境变量串起来。默认的 stack 看似万能,但生产出问题时往往查不到完整上下文;开发用 single 很方便,但上线不切日志轮转会撑爆磁盘;加 Slack 或数据库通道又容易因配置错位而静默失效。
单文件日志(single):开发调试最直接的方式
适合本地开发或轻量级部署,所有日志写入一个文件,便于 grep 和快速翻查。
-
必须改 config/logging.php 的 default:不能只改
LOG_CHANNEL=single,还要确保'default' => 'single',且'channels']['single存在并独立配置 -
path 要可写且父目录存在:例如
'path' => storage_path('logs/laravel.log'),Laravel 不自动创建storage/logs,需手动mkdir -p storage/logs && chmod -R 755 storage/logs -
别忽略 LOG_LEVEL:
APP_ENV=local时默认记录debug,但若缓存未清(php artisan config:clear),.env 修改可能不生效
每日日志(daily):生产环境推荐的轮转方案
按天生成文件(如 laravel-2026-06-01.log),自动清理旧日志,避免单文件膨胀。
-
days 参数控制保留周期:在
'daily'通道里设'days' => 30,就只留最近 30 天;设为0则永不删除 -
文件名不可自定义前缀:Monolog 的
RotatingFileHandler固定用日期拼接,想加prod-或api-前缀,得重写 Handler 或用符号链接软处理 -
轮转时机是“首次写入当天日志”时触发:如果某天没任何日志,就不会生成对应文件;发现没按天分割,优先检查
storage/logs/目录权限是否允许 PHP 进程创建新文件
多渠道聚合(stack):兼顾归档与告警的实用组合
用 stack 把多个通道绑在一起,比如同时写 daily 文件 + 发 Slack 错误通知,一条 Log::error() 就能双路触发。
-
stack 本身不存日志,只是转发器:它的
'channels'数组里列哪些通道,就往哪些通道发;其中一个失败(如 Slack Webhook 超时),默认静默跳过,要报错得加'ignore_exceptions' => false -
级别过滤各自独立:比如 stack 包含
daily(level=debug)和slack(level=error),那么Log::warning()只进文件,Log::error()才进 Slack -
别在 .env 和 config 里搞错通道名:.env 中
LOG_CHANNEL=stack必须对应 config/logging.php 里'channels']['stack的定义,否则 fallback 到默认逻辑,还不会提示
自定义业务通道:支付、审计等敏感操作单独落盘
把关键业务流(如支付回调、用户注销)和主日志分离,既方便排查,也满足审计合规要求。
-
新增通道要独立配置 driver 和 path:例如
'payment'通道用'driver' => 'daily','path' => storage_path('logs/payment.log'),路径权限同样要检查 -
用 tap 注入 Formatter 更可控:比如统一加 trace_id、user_id 字段,比全局改 Monolog 配置更安全;避免在
configureMonologUsing里硬编码,易与框架升级冲突 -
调用时显式指定 channel:用
Log::channel('payment')->info(...),而不是依赖 default;如果名字拼错,Laravel 会悄悄回退到 default 且不报错











