使用CDK 2创建Fargate日志指标过滤器时遇无效过滤模式错误
解决CloudWatch MetricFilter过滤Fargate错误日志的问题
错误原因
你当前的filterPattern写法不符合CloudWatch日志过滤模式的语法:
exists('{?error ?Error ?ERROR}')是错误用法,exists用于检查结构化日志中是否存在指定字段,但你的Fargate日志大概率是纯文本格式,且该模式本身语法不合法。- 即便日志是结构化的,
{?error ?Error ?ERROR}也不是正确的字段存在检查语法。
正确解决方案
根据日志格式分两种情况处理:
情况1:Fargate日志为纯文本格式(多数应用默认输出)
要匹配包含任意大小写error的日志行,直接使用不区分大小写的包含匹配:
new logs.MetricFilter(this, 'MetricFilter', { logGroup: props!.adminLogGroup, metricNamespace: 'fargate-metrics', metricName: 'fargate-error', // 匹配包含任意大小写"error"的纯文本日志行 filterPattern: logs.FilterPattern.literal('?error'), metricValue: "1", });
?error是CloudWatch日志过滤模式的语法,?前缀表示不区分大小写,会匹配所有包含error、Error、ERROR等任意大小写组合的日志行。
情况2:Fargate日志为结构化JSON格式(应用输出JSON日志)
如果应用输出JSON格式日志(例如{"message": "...", "level": "ERROR"}),需针对具体字段匹配:
- 匹配
message字段包含任意大小写error:
new logs.MetricFilter(this, 'MetricFilter', { logGroup: props!.adminLogGroup, metricNamespace: 'fargate-metrics', metricName: 'fargate-error', filterPattern: logs.FilterPattern.stringValue('$.message', 'contains', '?error'), metricValue: "1", });
- 匹配
level字段为任意大小写的error:
new logs.MetricFilter(this, 'MetricFilter', { logGroup: props!.adminLogGroup, metricNamespace: 'fargate-metrics', metricName: 'fargate-error', filterPattern: logs.FilterPattern.stringValue('$.level', '=', '?error'), metricValue: "1", });
验证方法
部署前可在CloudWatch控制台的目标日志组中,用对应的过滤模式(如?error)测试是否能匹配到目标日志,确认模式有效后再通过CDK部署。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

