如何模糊查询日志?

本文介绍不同方式的模糊查询。

通过查询语法进行模糊查询

查询原理

  1. 日志服务查询与模糊匹配条件一致的前100个词。

  2. 使用这前100个词去匹配日志记录中的内容,并返回包含这些词的日志条目。

因为只查询模糊条件命中的前100个词,所以当模糊条件前缀很短且日志中超过100个词时,查询结果会不精确。如果再结合not语句,会发现某些查询条件未被过滤。例如执行not abcd*查询语句,在结果中出现以abcd开头的词。

用法

在日志服务查询语法中,星号(*)代表多个任意字符的词,问号(?)代表单个字符的词。例如:abc*代表查询以abc开头的词。ab?d代表查询以ab开头、d结尾且中间包含单个字符的词, 详情请参见查询语法

通过SQL的like语法进行精确的模糊查询

like语法满足标准的SQL like语法,在like语法中百分号(%)代表任意个字符。下划线 (_)代表单个字符。

示例:查询key满足abcd开头的所有日志,对应的查询分析语句如下所示。

* | select * from log where key like 'abcd%'

查询key不是以abcd开头的所有日志

* | select * from log where key not like 'abcd%'

通过SQL的正则式函数进行模糊查询

通过正则式函数,可以在一个正则式中查询多个词。并且正则式的表达语义比like语法更强大,可以搜索满足数字的词以及满足特定字符的词等,详情请参见正则式函数

示例:

  • * | select * from log where regexp_like(key, abc*) 表示查询以abc开头的词。

  • * | select * from log where regexp_like(key, abc\d+) 表示查询以abc开头且后面跟着数字的词。

  • * | select * from log where regexp_like(key, abc[xyz])表示查询以abc开头且后面跟着xyz中的某个字符的词。