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
2
3
source:*.org
source:exam?le.org
source:exam?le.*

请注意,为避免过度消耗内存,禁用了前导通配符!你可以在你的 Graylog 配置文件中启用它们:

1
allow_leading_wildcard_searches = true 

还要注意,默认情况下,只有 message、full_message 和 source 这三个字段会被分析。虽然通配符搜索(使用 * 和 ?)适用于所有索引的字段,但分析过的字段的行为会有些不同。详情请参见通配符和正则表达式查询。

模糊性

你可以搜索相似的词汇:

1
2
ssh logni~  
source:exmaple.org~

这个例子使用了默认距离为2的 Damerau–Levenshtein 距离,将匹配 “ssh login” 和 “example.org”(查询中故意拼错)。

你可以像这样改变距离:

1
source:exmaple.org~1 

你也可以使用模糊性运算符进行接近搜索,其中短语中的词汇可以彼此有不同/模糊的距离,而不必按照定义的顺序:

1
"foo bar"~5 

数值字段支持范围查询。方括号中的范围是包含的,花括号中的范围是排除的,甚至可以组合使用:

1
2
3
4
http_response_code:[500 TO 504]
http_response_code:{400 TO 404}
bytes:{0 TO 64]
http_response_code:[0 TO 64}

你也可以进行一边无界的搜索:

1
2
3
4
http_response_code:>400
http_response_code:<400
http_response_code:>=400
http_response_code:<=400

还可以组合无界范围运算符:

1
http_response_code:(>=400 AND <500)

可以对日期字段进行范围查询。重要的是,时间选择器选定的时间段要符合你想要搜索的范围。如果你在过去的5分钟内搜索,但是搜索的时间是一周前,那么查询将不会返回任何内容。日期需要是 UTC 格式,格式需要像 Graylog 显示的那样:

1
timestamp:["2019-07-23 09:53:08.175" TO "2019-07-23 09:53:08.575"]

Graylog 为字段 timestamp 有一个自定义的索引映射,用于以 YYYY-MM-DD HH:MM:SS.sss 的格式保存日期。如果有一个额外的字段,Elasticsearch 判断这是一个日期并使用默认的日期格式,即 YYYY-MM-DD HH:MM:SS.sss。这意味着在那个期间的搜索将会像这样:

1
otherDate:["2019-07-23T09:53:08.175" TO "2019-07-23T09:53:08.575"]

至少在 Elasticsearch 6.x 中,你可以在时间范围中包含时区信息。查询将看起来像这样:

1
otherDate:["2020-07-29T12:00:00.000-05:00" TO "2020-07-30T15:13:00.000-05:00"] 

这个日期查询也可以是动态的,你总是回看指定的时间:

1
otherDate:[now-5d TO now-4d]

转义

以下字符必须使用反斜杠进行转义:

1
& | : \ / + - ! ( ) { } [ ] ^ " ~ * ?

示例:

1
resource:\/posts\/45326

正则表达式语法

正则表达式查询由 regexpquery_string 查询支持。Lucene 正则表达式引擎不兼容 Perl,但支持更小范围的运算符。

我们不会试图解释正则表达式,而只是解释支持的运算符。

标准运算符

锚定

大多数正则表达式引擎允许你匹配字符串的任何部分。如果你希望 regexp 模式从字符串的开始开始或在字符串的结束结束,那么你必须特别锚定它,使用 ^ 表示开始或 $ 表示结束。

Lucene 的模式总是锚定的。提供的模式必须匹配整个字符串。对于字符串 “abcde”:

1
2
ab.*     # 匹配
abcd # 不匹配

允许的字符

模式中可以使用任何 Unicode 字符,但某些字符是保留的,必须被转义。标准保留字符是:

1
. ? + * | { } [ ] ( ) " \

如果你启用了可选特性(见下文),那么这些字符可能也是保留的:

1
# @ & < >  ~

任何保留字符可以用反斜杠 “*“ 转义,包括文字反斜杠字符 “\“。

此外,任何字符(除双引号外)在双引号中被解释为字面值:

1
john"@smith.com"

匹配任何字符

句点 “.” 可用于代表任何字符。对于字符串 “abcde”:

1
2
ab...   # 匹配
a.c.e # 匹配

一次或多次

加号 “+” 可用于重复前面的最短模式一次或多次。对于字符串 “aaabbb”:

1
2
3
4
a+b+        # 匹配
aa+bb+ # 匹配
a+.+ # 匹配
aa+bbb+ # 匹配

零次或多次

星号 “*” 可用于匹配前面的最短模式零次或多次。对于字符串 “aaabbb”:

1
2
3
4
a*b*        # 匹配
a*b*c* # 匹配
.*bbb.* # 匹配
aaa*bbb* # 匹配

零次或一次

问号 “?” 使前面的最短模式变为可选。它匹配零次或一次。对于字符串 “aaabbb”:

1
2
3
4
aaa?bbb?    # 匹配
aaaa?bbbb? # 匹配
.....?.? # 匹配
aa?bb? # 不匹配

最小到最大

大括号 “{}” 可用于指定前面最短模式可以重复的最小和(可选)最大次数。允许的形式是:

1
2
3
{5}     # 重复5次
{2,5} # 至少重复2次,最多5次
{2,} # 至少重复2次

对于字符串 “aaabbb”:

1
2
3
4
5
6
7
a{3}b{3}        # 匹配
a{2,4}b{2,4} # 匹配
a{2,}b{2,} # 匹配
.{3}.{3} # 匹配
a{4}b{4} # 不匹配
a{4,6}b{4,6} # 不匹配
a{4,}b{4,} # 不匹配

分组

括号 “()” 可用于形成子模式。上面列出的数量运算符作用于最短的前面的模式,这可以是一个组。对于字符串 “ababab”:

1
2
3
4
5
6
7
8
9
(ab)+       # 匹配
ab(ab)+ # 匹配
(..)+ # 匹配
(...)+ # 不匹配
(ab)* # 匹配
abab(ab)? # 匹配
ab(ab)? # 不匹配
(ab){3} # 匹配
(ab){1,2} # 不匹配

交替

管道符 “|” 充当 OR 运算符。如果左侧或右侧的模式匹配,匹配将成功。交替适用于最长的模式,而不是最短的。对于字符串 “aabb”:

1
2
3
4
5
6
aabb|bbaa   # 匹配
aacc|bb # 不匹配
aa(cc|bb) # 匹配
a+|b+ # 不匹配
a+b+|b+a+ # 匹配
a+(b|c)+ # 匹配

字符类

可以将潜在字符的范围表示为字符类,通过在方括号 “[]” 中封闭它们。前导 ^ 对字符类取反。允许的形式是:

1
2
3
4
5
6
7
8
[abc]   # 'a''b''c'
[a-c] # 'a''b''c'
[-abc] # '-''a''b''c'
[abc\-] # '-''a''b''c'
[^abc] # 除 'a''b''c' 以外的任何字符
[^a-c] # 除 'a''b''c' 以外的任何字符
[^-abc] # 除 '-''a''b''c' 以外的任何字符
[^abc\-] # 除 '-''a''b''c' 以外的任何字符

注意,破折号 “-“ 表示一系列字符,除非它是第一个字符或者它被反斜杠转义。

对于字符串 “abcd”:

1
2
3
ab[cd]+     # 匹配
[a-d]+ # 匹配
[^a-d]+ # 不匹配

可选运算符

这些运算符默认可用,因为 flags 参数默认为 ALL。可以使用不同的标志组合(用 “|” 连接)来启用/禁用特定运算符:

1
2
3
4
5
6
7
8
{
"regexp": {
"username": {
"value": "john~athon<1-5>",
"flags": "COMPLEMENT|INTERVAL"
}
}
}

补集

补集可能是最有用的选项。跟在波浪线 ““ 后面的最短模式是取反的。例如,”abcd” 意味着:

  • 以 a 开始
  • 后跟 b
  • 后跟一个任意长度的字符串,该字符串不是 c
  • 以 d 结束

对于字符串 “abcdef”:

1
2
3
4
5
ab~df     # 匹配
ab~cf # 匹配
ab~cdef # 不匹配
a~(cb)def # 匹配
a~(bc)def # 不匹配

使用 COMPLEMENT 或 ALL 标志启用。

区间

区间选项启用了使用尖括号 “<>” 封闭的数字范围。对于字符串 “foo80”:

1
2
3
foo<1-100>     # 匹配
foo<01-100> # 匹配
foo<001-100> # 不匹配

使用 INTERVAL 或 ALL 标志启用。

交集

符号 “&” 连接两个模式,使它们都必须匹配。对于字符串 “aaabbb”:

1
2
aaa.+&.+bbb     # 匹配
aaa&bbb

错误类型

在输入查询时,请务必注意警告和异常。如果你输入了 Graylog 无法理解的查询,会出现一个带有黄色感叹号的图标,以及一条带有警告或异常的消息。它们包括:

  • 解析异常 - 当发生解析错误时,会抛出此异常。当你在搜索查询的语法中出错时,会出现这个异常。错误消息应该包含有关语法错误位置的更多信息。
  • 无效运算符 - 当运算符拼写错误时,会出现此错误。例如,AND 是一个有效的运算符,但 and 不是。在大多数情况下,运算符是大写的。
  • 未知字段 - 当你在搜索查询中包含一个不存在于相关索引集的字段时,会出现此警告。这是由流和索引集之间的关系决定的。
  • 参数错误 - 当你在搜索查询中使用一个未声明的参数时,会出现此错误。

参数需要在你将它们包含在搜索中之前进行定义。


Graylog 查询语句语法
https://sugayoiya.github.io/posts/2802.html
作者
Sugayoiya
发布于
2022年3月5日
许可协议