Laravel 默认支持 Slack 日志通道,但需满足三个前提:LOG_CHANNEL=slack、配置有效SLACK_WEBHOOK_URL、日志级别不低于error;否则无消息发出。

直接说结论:Laravel 默认已支持 Slack 日志通道,但必须满足三个前提——LOG_CHANNEL=slack、配置了有效的 SLACK_WEBHOOK_URL、且日志级别不低于 error;否则发不出任何消息。
Slack 通道在 Laravel 中怎么启用
Laravel 的日志系统基于 Monolog,slack 是内置通道之一,无需额外安装包(Laravel 9+ 已内置 Monolog\Handler\SlackWebhookHandler)。启用只需两步:
- 在
.env中设置:LOG_CHANNEL=slack - 确保
SLACK_WEBHOOK_URL指向一个有效的 Slack Incoming Webhook URL(格式类似https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX) - 注意:Laravel 不会校验该 URL 是否真实有效,错误只会静默失败(可通过
php artisan tinker手动触发日志测试)
为什么写了 LOG_CHANNEL=slack 却没收到消息
最常见原因是日志级别被过滤掉了。Slack 通道默认只转发 error 及以上级别(error、critical、alert、emergency),warning 和 info 不会发送。
- 检查
config/logging.php中slack通道的level配置,默认是'level' => 'error' - 若想连
warning也推送,需显式修改为'level' => 'warning' - 运行
php artisan config:clear后再测试,否则.env或配置缓存可能掩盖问题 - 留意 Slack webhook 是否被组织策略屏蔽(尤其企业版 Slack),可先用
curl手动 POST 测试:
curl -X POST -H 'Content-type: application/json' --data '{"text":"test from curl"}' https://hooks.slack.com/services/...
如何让不同环境走不同通道(比如本地不发 Slack)
不要硬编码 LOG_CHANNEL,而是利用 Laravel 的环境驱动配置。在 config/logging.php 中定义多通道并按环境切换:
- 在
'channels'下新增一个自定义通道,例如'production_slack',其driver设为slack - 在
'stack'通道的'channels'数组里,根据APP_ENV动态决定是否包含它(用env('APP_ENV') === 'production'判断) - 更稳妥的做法是:始终用
stack作为默认通道,在.env中设LOG_CHANNEL=stack,然后在stack.channels里按环境条件拼接数组
这种写法避免了本地误推 Slack,也方便后续加 Sentry、DB 等其他通道而不改环境变量。
Slack 消息内容太简陋,怎么加上下文或请求信息
默认 Slack 日志只含消息和级别,要附加用户 ID、URL、IP 或异常堆栈,得自定义 SlackWebhookHandler 的 formatter。推荐做法是扩展 config/logging.php 中的 slack 通道:
- 添加
'tap' => [App\Logging\CustomizeSlackLog::class] - 新建
app/Logging/CustomizeSlackLog.php,实现__invoke方法,在其中调用$handler->setFormatter(...) - Formatter 返回的数组必须符合 Slack 的
attachments结构,比如加入'fields'显示request.url和context.exception - 注意:异常对象不能直接 JSON 序列化,要用
$record['context']['exception']->getTraceAsString()提取字符串
这个环节最容易漏掉的是上下文字段的键名映射——Slack 接收的是扁平字段,而 Laravel 日志的 context 是嵌套结构,必须手动展平。










