如何高效监控AWS栈多LogGroup下的Laravel/PHP错误并自动告警?
多CloudWatch LogGroup统一错误告警实现方案
核心逻辑
无需为每个LogGroup单独创建告警规则,通过CloudWatch Logs订阅过滤器 + 公共处理Lambda + SNS主题实现全量LogGroup的错误监控告警,完全规避LogInsight多LogGroup查询限制。
实现步骤
1. 定义错误匹配规则
针对你给出的PHP/API错误日志特征,订阅过滤器直接使用如下过滤模式,覆盖所有ERROR日志和Exception异常场景:
"?ERROR?" "Exception"
2. 实现全量LogGroup自动绑定订阅规则
- 开发公共配置Lambda:调用CloudWatch Logs OpenAPI,为所有符合业务命名规则(可匹配你CloudFormation生成的LogGroup统一前缀)的存量LogGroup批量绑定订阅过滤器,所有匹配到的错误日志统一推送到后续的告警处理Lambda。
- 配置EventBridge触发规则:监听CloudTrail的
CreateLogGroup事件,只要有新LogGroup创建就自动触发上述公共配置Lambda,为新LogGroup自动绑定订阅规则,无需人工介入适配CloudFormation批量部署场景。
3. 开发告警处理Lambda
Lambda的核心处理逻辑如下:
- 接收订阅过滤器推送的压缩日志数据,完成解压、解码操作
- 提取日志对应的LogGroup名称、日志产生时间、错误详情三个核心字段
- 拼装标准化告警内容,示例如下:
【CloudWatch业务错误告警】
关联LogGroup:/aws/lambda/xxx-prod-user-service
错误时间:2021-11-24T13:03:48.075879+00:00
错误内容:[2021-11-24T13:03:48.075879+00:00] technical.ERROR: TYPE: Trzproject\Trzutils\Exceptions\InvalidJWTException MESSAGE: Provided JWT has since expired, as defined by the "exp" claim FILE: /var/task/vendor/trzproject/trzcore/src/Trzutils/JWT/JWTService.php LINE: 64
- 把告警内容推送到预先创建的SNS主题,也可以直接调用Slack Webhook完成推送。
4. 配置多渠道告警分发
- 邮件告警:直接为SNS主题绑定目标邮箱地址,验证通过后即可接收告警
- Slack告警:可在SNS主题下绑定Slack转发Lambda,也可以直接在告警处理Lambda中调用Slack应用的入站Webhook完成推送。
可选优化项
- 可在告警处理Lambda中加入错误去重逻辑,同一LogGroup下同一类型错误1分钟内只推送1次,避免告警轰炸
- 可根据LogGroup前缀区分不同客户/业务线,告警内容中自动标注业务线信息,方便快速定位问题
- 订阅过滤器可通过排除关键词过滤掉不需要告警的已知错误,进一步减少不必要的告警推送
内容的提问来源于stack exchange,提问作者Mitsukk
相关产品推荐
相关产品推荐

