AWS CloudWatch日志过滤失效:无法触发Lambda发送Python异常告警邮件
问题排查:CloudWatch日志过滤器无法触发Lambda告警
1. 过滤器语法用错了
你写的?Exception ?Error ?Traceback是CloudWatch Insights的查询语法,但用来触发Lambda的日志过滤器得用CloudWatch Filter Pattern语法,这俩完全不是一回事。正确的写法应该是:
"Exception" || "Error" || "Traceback"
或者用空格表示逻辑OR(效果一致):
"Exception" "Error" "Traceback"
如果日志是结构化格式(比如JSON),还得对应字段名配置,比如日志是{"level": "ERROR"},过滤器要写成{$.level = "ERROR"}。
2. 日志内容和关键词不匹配
- 先手动去CloudWatch日志组里搜,确认Python脚本输出的异常日志里是不是真的有精确的
Exception、Error、Traceback字符串。比如有些自定义日志可能用全大写(EXCEPTION)、缩写或非英文表述,过滤器自然匹配不到。 - 要是Python的Traceback是多行输出的,默认过滤器只按单行匹配,大概率会漏过。这种情况要在日志订阅过滤器里开启多行模式,设置起始匹配规则,比如
Traceback (most recent call last):,让CloudWatch把整个异常栈当成一个事件处理。
3. 订阅/告警配置没到位
- 检查Lambda的触发器是否真的绑定了目标日志组,且过滤器模式是填在触发器配置里的,不是只在Insights里查询了就算数。
- 确认Lambda的权限:触发器配置时AWS会自动生成接收日志事件的权限,但如果手动修改过角色,可能导致权限丢失;另外Lambda自身也需要写日志的权限,不然执行失败了你都看不到报错信息。
- 要是用CloudWatch告警触发Lambda,得确认告警规则的触发条件:比如是否设为“匹配到至少1条日志事件”,评估周期是否合理——比如设成5分钟,但异常日志只出现了1分钟,就可能错过触发。
4. 日志根本没传到CloudWatch
先确认ECS任务的日志驱动是不是awslogs,日志组名称、区域是否和你配置过滤器的一致。去日志组里搜搜有没有任务的正常日志,如果连正常日志都没有,得先排查ECS日志驱动配置:比如任务定义里的logConfiguration是否正确,IAM角色有没有logs:CreateLogStream、logs:PutLogEvents权限。
5. Lambda本身出问题了
去Lambda的CloudWatch日志组里查看,有没有调用失败的记录:比如权限不足、处理日志事件的代码报错,导致触发器触发了但Lambda执行失败,你误以为没触发。另外也检查下Lambda的并发是否被打满,新请求无法进入。
内容的提问来源于stack exchange,提问作者Joseph Quinn
相关产品推荐
相关产品推荐

