laravel 11 日志与异常处理需重构配置:确认 default 通道有效、清除并重缓存配置、修复 daily 轮转路径与权限、独立配置 slack 通道级别、迁移异常处理至 bootstrap/app.php 的 withexceptions()、启用 pail 实时监听关键日志。

升级 Laravel 11 后,日志通道配置失效、监控告警静默丢失、daily 日志不再按天轮转、Slack 通知收不到——这些不是环境问题,而是 Laravel 11 对日志系统和异常处理中枢做了结构级重构,旧配置在新版本中被忽略或行为变更。
确认日志通道是否真正生效
第一步:检查 config/logging.php 中的 'default' 键值是否明确指向一个真实存在的通道名,例如 'daily' 或 'single',【不能是 stack 而其 channels 数组为空】。
第二步:运行 php artisan tinker → Log::debug('test') → 立即检查 storage/logs/ 下对应文件是否新增内容。若无输出,说明通道未启用或路径不可写。
第三步:执行 php artisan config:clear && php artisan config:cache,确保 .env 中 LOG_CHANNEL 的值已注入配置缓存;【APP_ENV=production 时,LOG_LEVEL 默认为 error,debug 级别日志会被直接丢弃】。
修复 daily 日志不轮转或文件堆积问题
方法一:确认 'daily' 通道配置中包含 'days' => 30(或其他正整数),且 'path' 指向 storage_path('logs/laravel.log') —— Monolog 的 RotatingFileHandler 仅在此路径基础上拼接日期后缀,不支持自定义前缀。
方法二:检查 storage/logs 目录权限,PHP 进程必须对父目录有写+执行权限(chmod 755),否则无法创建 laravel-2026-08-06.log 新文件,导致所有日志仍写入 laravel.log。
方法三:手动触发轮转验证:清空 storage/logs → 设置 APP_DEBUG=true → 发起一次报错请求 → 查看是否生成带日期的新文件。若仍失败,说明 daily 驱动未被正确加载,需检查 config/logging.php 中该通道是否被注释或拼写错误。
重配 Slack 告警通道并验证连通性
第一步:在 config/logging.php 的 'channels' 数组中添加独立 slack 通道,驱动为 'slack',必须填写 'url'(Slack Webhook URL)和 'username'(可选)。
第二步:确保该通道的 'level' 设为 'error' 或更低(如 'warning'),否则 Log::error() 不会触发发送;【stack 通道中嵌套的 slack 若 level 高于实际日志级别,将完全静默】。
第三步:执行 php artisan log:tail → 在另一终端运行 Log::channel('slack')->error('test alert') → 观察 Slack 频道是否收到消息。若无响应,检查 Webhook URL 是否过期或网络策略拦截 POST 请求。
迁移异常处理逻辑至 bootstrap/app.php
第一步:删除 app/Exceptions/Handler.php 文件(Laravel 11 默认不生成此文件),若保留则其 report() 和 render() 方法将被完全忽略。
第二步:打开 bootstrap/app.php,在 withExceptions() 闭包内注册 report 回调:
→ use Illuminate\Contracts\Logging\Log;
→ ->withExceptions(function (Illuminate\Foundation\Exceptions\Handler $handler) {
$handler->report(function (Throwable $e) {
if ($e instanceof \App\Exceptions\PaymentFailedException) {
Log::channel('slack')->error('支付失败', ['code' => $e->getCode()]);
return false;
}
});
});
第三步:在 report 回调中调用 return false 可终止后续默认日志记录,避免重复落库;【未显式 return false 的异常仍会进入 config/app.php 中定义的 log_channel】。
启用 Pail 追踪关键操作日志
安装:composer require laravel/pail。
发布配置:php artisan vendor:publish --tag=pail-config。
启动监听:php artisan pail:listen --name=payment → 此时所有 Log::channel('payment')->info() 日志将实时推送到终端,无需 tail 文件;【Pail 不替代 daily,而是补充高频业务操作的即时可见性】。











