CloudWatch Logs Insights如何实现多关键词不区分大小写的日志过滤
解决方案
你原有写法里的any(关键词数组) in log只能匹配存在任意一个关键词的日志,要实现不区分大小写、不限词序、筛选存在至少2个预定义关键词的日志,可以用以下两种方案:
方案1:正则实现(兼容你原有like语法)
如果你的查询引擎支持正则前瞻,直接用以下语法即可:
- 允许同一关键词重复出现2次即判定为符合条件:
FILTER log like /(?i)(?=.*\b(alter|create|drop if exists)\b)(?=.*\b(alter|create|drop if exists)\b)/
- 要求必须匹配2个不同的关键词才判定为符合条件,调整正则如下:
FILTER log like /(?i)(?=.*\b(alter|create|drop if exists)\b)(?=.*\b(?!\1)(alter|create|drop if exists)\b)/
说明:
\b是单词边界符,可避免关键词嵌入其他单词时被误匹配(比如alteration里的alter不会被识别),如果不需要精准匹配整词可以删掉\b。
方案2:数组函数实现(更易维护,适合关键词较多的场景)
如果你的查询引擎支持字符串处理和数组函数(如ClickHouse、Spark SQL、Databend等),可以用更易读的写法,后续新增关键词只需要修改数组内容即可:
FILTER -- 统计匹配到的关键词数量,≥2则保留日志 length( arrayFilter( keyword -> position(lower(log), lower(keyword)) > 0, -- 预定义关键词列表,直接增删元素即可调整规则 ['alter', 'create', 'drop if exists'] ) ) >= 2
说明:通过
lower()统一转小写实现不区分大小写匹配,不需要调整正则语法,规则修改成本更低。
内容的提问来源于stack exchange,提问作者aalma
相关产品推荐
相关产品推荐

