如何过滤CloudWatch INFO日志 降低AWS账号IMR成本
从成本最优角度,按优先级从高到低选以下方案即可,核心原则是尽量在日志上报到CloudWatch存储前就丢弃INFO日志,避免产生摄入、存储、检索全链路的IMR费用,不要等日志存入日志组后再做查询侧过滤,这类操作不会降低任何成本。
方案1:应用层直接关闭INFO日志输出(成本最低,无额外开销)
如果你能控制业务代码的日志配置,直接修改日志框架的输出级别为ERROR及以上,从源头不生成INFO类请求日志,不需要额外配置CloudWatch侧规则。
常见日志框架配置示例:<!-- Logback配置示例,生产环境root日志级别设为ERROR --> <root level="ERROR"> <appender-ref ref="CloudWatchAppender" /> </root># Python logging配置示例 import logging logging.basicConfig(level=logging.ERROR)方案2:CloudWatch Agent采集侧过滤(适用于EC2、自建服务器上的业务)
如果业务部署在自己管理的主机上,通过CloudWatch Agent上报日志,直接修改Agent配置文件,添加采集过滤规则,在Agent采集环节就丢弃带[INFO]标记的日志,不上报到CloudWatch:[logs.filters.app_log_filter] # 匹配到[INFO]标记的日志直接丢弃 drop = ["\\[INFO\\]"] # 仅保留需要留存的日志级别 keep = ["\\[ERROR\\]", "\\[WARN\\]", "\\[FATAL\\]"]修改完成后执行
sudo amazon-cloudwatch-agent-ctl -a restart重启Agent即可生效。方案3:日志组摄入层过滤(适用于Lambda、ECS、ALB等AWS托管服务上报的日志)
对于没法修改上报端配置的托管服务日志,直接在对应日志组配置摄入过滤规则,日志到达CloudWatch后会先经过规则匹配,匹配到INFO的日志直接丢弃,不会写入存储产生费用:- 进入CloudWatch控制台,打开目标日志组详情页
- 找到「日志转换」板块,选择「添加摄入过滤器」
- 过滤规则选择自定义匹配,匹配表达式填写
\[INFO\],匹配动作选择「丢弃匹配的日志事件」 - 将该规则优先级调整为最高,保存配置后新上报的日志就会自动按规则过滤
踩坑提醒:不要用CloudWatch Insights查询过滤、指标过滤器这类查询侧的功能实现日志筛选,这类操作只是让你看不到INFO日志,日志已经完成摄入、存入存储层,IMR相关费用会正常计算,达不到降本的目的。
配置完成后可将日志组的历史日志保留周期调整为7-30天(根据自身合规需求设置),删除已存储的历史INFO日志,进一步压缩存储成本。配置生效24小时后可查看CloudWatch账单的日志摄入字节数指标,确认过滤规则生效。
内容的提问来源于stack exchange,提问作者Shivangi Rana

