Graylog 查询语句语法
编写搜索查询
语法
搜索语法非常接近 Lucene 语法。如果你没有指定要搜索的消息字段,那么默认情况下所有的消息字段都会被包括在搜索中。
包含词汇 ssh 的消息:
1
ssh
包含词汇 ssh 或 login 的消息:
1
ssh login
包含精确短语 ssh login 的消息:
1
"ssh login"
字段 type 包含 ssh 的消息:
1
type:ssh
字段 type 包含 ssh 或 login 的消息:
1
type:(ssh OR login)
提示:Elasticsearch 2.x 和 5.x 在空格处分割查询,所以查询
type:(ssh login)
等同于type:(ssh OR login)
。在 Elasticsearch 6.0 中,这种情况已经不再存在,你现在必须在每个词汇之间包含一个 OR 运算符。字段 type 包含精确短语 ssh login 的消息:
1
type:"ssh login"
具有字段 type 的消息:
1
_exists_:type
不具有字段 type 的消息:
1
NOT _exists_:type
提示:Elasticsearch 2.x 允许使用
_missing_:type
替代NOT _exists_:type
。这种查询语法在 Elasticsearch 5.0 中已被移除。匹配正则表达式 ethernet[0-9]+ 的消息:
1
/ethernet[0-9]+/
提示:请参考 Elasticsearch 文档中关于正则表达式语法的部分,以获取关于支持的正则表达式方言的详细信息。
默认情况下,所有的词汇或短语都是 OR 连接的,所以所有至少有一个命中的消息都会被返回。你可以使用布尔运算符和组来控制这一点:
1
2"ssh login" AND source:example.org
("ssh login" AND (source:example.org OR source:another.example.org)) OR _exists_:always_find_me
你也可以使用 NOT 运算符:
1
2"ssh login" AND NOT source:example.org
NOT example.org
请注意,AND、OR 和 NOT 是区分大小写的,必须全部使用大写字母输入。
通配符
使用 ?
替换单个字符或 *
替换零个或多个字符:
1 |
|
请注意,为避免过度消耗内存,禁用了前导通配符!你可以在你的 Graylog 配置文件中启用它们:
1 |
|
还要注意,默认情况下,只有 message、full_message 和 source 这三个字段会被分析。虽然通配符搜索(使用 * 和 ?)适用于所有索引的字段,但分析过的字段的行为会有些不同。详情请参见通配符和正则表达式查询。
模糊性
你可以搜索相似的词汇:
1 |
|
这个例子使用了默认距离为2的 Damerau–Levenshtein 距离,将匹配 “ssh login” 和 “example.org”(查询中故意拼错)。
你可以像这样改变距离:
1 |
|
你也可以使用模糊性运算符进行接近搜索,其中短语中的词汇可以彼此有不同/模糊的距离,而不必按照定义的顺序:
1 |
|
数值字段支持范围查询。方括号中的范围是包含的,花括号中的范围是排除的,甚至可以组合使用:
1 |
|
你也可以进行一边无界的搜索:
1 |
|
还可以组合无界范围运算符:
1 |
|
可以对日期字段进行范围查询。重要的是,时间选择器选定的时间段要符合你想要搜索的范围。如果你在过去的5分钟内搜索,但是搜索的时间是一周前,那么查询将不会返回任何内容。日期需要是 UTC 格式,格式需要像 Graylog 显示的那样:
1 |
|
Graylog 为字段 timestamp 有一个自定义的索引映射,用于以 YYYY-MM-DD HH:MM:SS.sss 的格式保存日期。如果有一个额外的字段,Elasticsearch 判断这是一个日期并使用默认的日期格式,即 YYYY-MM-DD HH:MM:SS.sss。这意味着在那个期间的搜索将会像这样:
1 |
|
至少在 Elasticsearch 6.x 中,你可以在时间范围中包含时区信息。查询将看起来像这样:
1 |
|
这个日期查询也可以是动态的,你总是回看指定的时间:
1 |
|
转义
以下字符必须使用反斜杠进行转义:
1 |
|
示例:
1 |
|
正则表达式语法
正则表达式查询由 regexp
和 query_string
查询支持。Lucene 正则表达式引擎不兼容 Perl,但支持更小范围的运算符。
我们不会试图解释正则表达式,而只是解释支持的运算符。
标准运算符
锚定
大多数正则表达式引擎允许你匹配字符串的任何部分。如果你希望 regexp 模式从字符串的开始开始或在字符串的结束结束,那么你必须特别锚定它,使用 ^
表示开始或 $
表示结束。
Lucene 的模式总是锚定的。提供的模式必须匹配整个字符串。对于字符串 “abcde”:
1 |
|
允许的字符
模式中可以使用任何 Unicode 字符,但某些字符是保留的,必须被转义。标准保留字符是:
1 |
|
如果你启用了可选特性(见下文),那么这些字符可能也是保留的:
1 |
|
任何保留字符可以用反斜杠 “*“ 转义,包括文字反斜杠字符 “\“。
此外,任何字符(除双引号外)在双引号中被解释为字面值:
1 |
|
匹配任何字符
句点 “.” 可用于代表任何字符。对于字符串 “abcde”:
1 |
|
一次或多次
加号 “+” 可用于重复前面的最短模式一次或多次。对于字符串 “aaabbb”:
1 |
|
零次或多次
星号 “*” 可用于匹配前面的最短模式零次或多次。对于字符串 “aaabbb”:
1 |
|
零次或一次
问号 “?” 使前面的最短模式变为可选。它匹配零次或一次。对于字符串 “aaabbb”:
1 |
|
最小到最大
大括号 “{}” 可用于指定前面最短模式可以重复的最小和(可选)最大次数。允许的形式是:
1 |
|
对于字符串 “aaabbb”:
1 |
|
分组
括号 “()” 可用于形成子模式。上面列出的数量运算符作用于最短的前面的模式,这可以是一个组。对于字符串 “ababab”:
1 |
|
交替
管道符 “|” 充当 OR 运算符。如果左侧或右侧的模式匹配,匹配将成功。交替适用于最长的模式,而不是最短的。对于字符串 “aabb”:
1 |
|
字符类
可以将潜在字符的范围表示为字符类,通过在方括号 “[]” 中封闭它们。前导 ^ 对字符类取反。允许的形式是:
1 |
|
注意,破折号 “-“ 表示一系列字符,除非它是第一个字符或者它被反斜杠转义。
对于字符串 “abcd”:
1 |
|
可选运算符
这些运算符默认可用,因为 flags
参数默认为 ALL。可以使用不同的标志组合(用 “|” 连接)来启用/禁用特定运算符:
1 |
|
补集
补集可能是最有用的选项。跟在波浪线 ““ 后面的最短模式是取反的。例如,”abcd” 意味着:
- 以 a 开始
- 后跟 b
- 后跟一个任意长度的字符串,该字符串不是 c
- 以 d 结束
对于字符串 “abcdef”:
1 |
|
使用 COMPLEMENT 或 ALL 标志启用。
区间
区间选项启用了使用尖括号 “<>” 封闭的数字范围。对于字符串 “foo80”:
1 |
|
使用 INTERVAL 或 ALL 标志启用。
交集
符号 “&” 连接两个模式,使它们都必须匹配。对于字符串 “aaabbb”:
1 |
|
错误类型
在输入查询时,请务必注意警告和异常。如果你输入了 Graylog 无法理解的查询,会出现一个带有黄色感叹号的图标,以及一条带有警告或异常的消息。它们包括:
- 解析异常 - 当发生解析错误时,会抛出此异常。当你在搜索查询的语法中出错时,会出现这个异常。错误消息应该包含有关语法错误位置的更多信息。
- 无效运算符 - 当运算符拼写错误时,会出现此错误。例如,AND 是一个有效的运算符,但 and 不是。在大多数情况下,运算符是大写的。
- 未知字段 - 当你在搜索查询中包含一个不存在于相关索引集的字段时,会出现此警告。这是由流和索引集之间的关系决定的。
- 参数错误 - 当你在搜索查询中使用一个未声明的参数时,会出现此错误。
参数需要在你将它们包含在搜索中之前进行定义。