Laravel7如何捕获Swift_TransportException屏蔽其Slack告警
Laravel7 排除指定Swift_TransportException推送至Slack的实现方案
是否可以通过$dontReport属性拦截?
可以。$dontReport是Laravel异常处理器自带的异常过滤属性,配置后对应异常会被全局拦截,不会上报到任何日志通道(包括Slack)。
配置方式:打开app/Exceptions/Handler.php文件,在$dontReport数组中追加对应异常类即可:
/** * 不需要上报的异常类列表 * * @var array */ protected $dontReport = [ // 框架原有默认配置的无需上报异常 \Swift_TransportException::class, ];
注意:该方案会全量拦截所有
Swift_TransportException类的异常上报,如果仅需要拦截「Connection could not be established with host」这类特定报错、保留其他Swift邮件异常的告警,不适合用该方案。
其他更灵活的拦截方案
1. 通过reportable闭包精准过滤特定异常
如果你只需要拦截连接建立失败的特定报错,不影响其他同类型异常的正常告警,可以在Handler.php的register()方法中定义上报回调,匹配到目标异常时返回false即可阻止上报:
// 引入字符串工具类 use Illuminate\Support\Str; public function register() { $this->reportable(function (\Swift_TransportException $e) { // 匹配目标错误消息 if (Str::contains($e->getMessage(), 'Connection could not be established with host')) { // 返回false即终止该异常的后续上报流程 return false; } }); }
该方案的拦截逻辑对所有日志通道生效,支持按异常消息、错误码、上下文做自定义判断,灵活度最高。
2. 仅在Slack日志通道排除目标异常
如果你希望该异常正常写入本地日志文件、仅不推送到Slack频道,可以直接修改config/logging.php中Slack通道的配置,增加except参数指定要排除的异常类:
'channels' => [ // 其他日志通道配置 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => env('LOG_LEVEL', 'critical'), // 配置不推送到Slack的异常类 'except' => [ \Swift_TransportException::class, ], ], ],
方案选型参考
- 完全不需要记录该类任何异常,选
$dontReport全局拦截 - 需要按异常特征精准过滤部分报错,选
reportable闭包自定义逻辑 - 需要保留本地日志、仅屏蔽Slack推送,选Slack通道配置
except的方案
内容的提问来源于stack exchange,提问作者Taylor FS
相关产品推荐
相关产品推荐

