剖析处理器

编辑

Grok 处理器 类似,剖析处理器也从文档中的单个文本字段中提取结构化字段。但与 Grok 处理器 不同的是,剖析处理器不使用 正则表达式。这使得剖析处理器的语法简单,并且在某些情况下比 Grok 处理器 更快。

剖析处理器将单个文本字段与定义的模式进行匹配。

例如,以下模式

%{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}

将匹配以下格式的日志行

1.2.3.4 - - [30/Apr/1998:22:00:52 +0000] \"GET /english/venues/cities/images/montpellier/18.gif HTTP/1.0\" 200 3171

并生成具有以下字段的文档

"doc": {
  "_index": "_index",
  "_type": "_type",
  "_id": "_id",
  "_source": {
    "request": "/english/venues/cities/images/montpellier/18.gif",
    "auth": "-",
    "ident": "-",
    "verb": "GET",
    "@timestamp": "30/Apr/1998:22:00:52 +0000",
    "size": "3171",
    "clientip": "1.2.3.4",
    "httpversion": "1.0",
    "status": "200"
  }
}

剖析模式由将被丢弃的字符串部分定义。在前面的示例中,第一个要丢弃的部分是单个空格。剖析处理器找到这个空格,然后将 clientip 的值赋值为该空格之前的所有内容。接下来,剖析处理器匹配 [,然后匹配 ],然后将 @timestamp 赋值为 [] 之间的所有内容。特别注意要丢弃的字符串部分将有助于构建成功的剖析模式。

成功匹配需要模式中的所有键都具有值。如果模式中定义的任何 %{keyname} 没有值,则会抛出异常,并且可以使用 on_failure 指令来处理。可以使用空键 %{}命名跳过键 来匹配值,但将该值排除在最终文档之外。所有匹配的值都表示为字符串数据类型。可以使用 转换处理器 来转换为预期的数据类型。

剖析处理器还支持 键修饰符,这些修饰符可以更改剖析处理器的默认行为。例如,您可以指示剖析处理器忽略某些字段、附加字段、跳过填充等。有关更多信息,请参见 下文

表 13. 剖析选项

名称 必需 默认值 描述

field

-

要剖析的字段

pattern

-

要应用于该字段的模式

append_separator

""(空字符串)

分隔附加字段的字符。

ignore_missing

如果为 truefield 不存在或为 null,则处理器会静默退出,而不修改文档

description

-

处理器的描述。有助于描述处理器的目的或其配置。

if

-

有条件地执行处理器。请参见 有条件地运行处理器

ignore_failure

忽略处理器的故障。请参见 处理管道失败

on_failure

-

处理处理器的故障。请参见 处理管道失败

tag

-

处理器的标识符。有助于调试和指标。

{
  "dissect": {
    "field": "message",
    "pattern" : "%{clientip} %{ident} %{auth} [%{@timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}"
   }
}

剖析键修饰符

编辑

键修饰符可以更改剖析的默认行为。键修饰符可以在 %{keyname} 的左侧或右侧找到,始终在 %{} 内。例如,%{+keyname ->} 具有附加和右填充修饰符。

表 14. 剖析键修饰符

修饰符 名称 位置 示例 描述 详细信息

->

跳过右填充

(最)右侧

%{keyname1->}

跳过右侧的任何重复字符

链接

+

附加

左侧

%{+keyname} %{+keyname}

将两个或多个字段附加在一起

链接

+/n

按顺序附加

左侧和右侧

%{+keyname/2} %{+keyname/1}

按照指定的顺序将两个或多个字段附加在一起

链接

?

命名跳过键

左侧

%{?ignoreme}

跳过输出中匹配的值。行为与 %{} 相同

链接

*&

引用键

左侧

%{*r1} %{&r1}

将输出键设置为 * 的值,将输出值设置为 & 的值

链接

右填充修饰符 (->)

编辑

执行剖析的算法非常严格,因为它要求模式中的所有字符都与源字符串匹配。例如,模式 %{fookey} %{barkey} (1 个空格) 将匹配字符串 "foo bar" (1 个空格),但不会匹配字符串 "foo  bar" (2 个空格),因为模式只有 1 个空格,而源字符串有 2 个空格。

右填充修饰符可以帮助解决此问题。将右填充修饰符添加到模式 %{fookey->} %{barkey},它现在将匹配 "foo bar" (1 个空格) 和 "foo  bar" (2 个空格),甚至 "foo          bar" (10 个空格)。

使用右填充修饰符来允许重复 %{keyname->} 后的字符。

右填充修饰符可以放置在具有任何其他修饰符的任何键上。它应该始终是最右侧的修饰符。例如:%{+keyname/1->}%{->}

右填充修饰符示例

模式

%{ts->} %{level}

输入

1998-08-10T17:15:42,466          WARN

结果

  • ts = 1998-08-10T17:15:42,466
  • level = WARN

右填充修饰符可以与空键一起使用,以帮助跳过不需要的数据。例如,相同的输入字符串,但用括号括起来,需要使用空的右填充键才能达到相同的结果。

带有空键的右填充修饰符示例

模式

[%{ts}]%{->}[%{level}]

输入

[1998-08-10T17:15:42,466]            [WARN]

结果

  • ts = 1998-08-10T17:15:42,466
  • level = WARN

附加修饰符 (+)

编辑

剖析处理器支持将两个或多个结果附加在一起以进行输出。值从左到右附加。可以指定附加分隔符。在此示例中,附加分隔符定义为空格。

附加修饰符示例

模式

%{+name} %{+name} %{+name} %{+name}

输入

john jacob jingleheimer schmidt

结果

  • name = john jacob jingleheimer schmidt

按顺序附加修饰符 (+/n)

编辑

剖析处理器支持将两个或多个结果附加在一起以进行输出。值根据定义的顺序 (/n) 附加。可以指定附加分隔符。在此示例中,附加分隔符定义为逗号。

按顺序附加修饰符示例

模式

%{+name/2} %{+name/4} %{+name/3} %{+name/1}

输入

john jacob jingleheimer schmidt

结果

  • name = schmidt,john,jingleheimer,jacob

命名跳过键 (?)

编辑

剖析处理器支持忽略最终结果中的匹配项。这可以使用空键 %{} 完成,但为了提高可读性,可能希望为该空键指定一个名称。

命名跳过键修饰符示例

模式

%{clientip} %{?ident} %{?auth} [%{@timestamp}]

输入

1.2.3.4 - - [30/Apr/1998:22:00:52 +0000]

结果

  • clientip = 1.2.3.4
  • @timestamp = 30/Apr/1998:22:00:52 +0000

引用键 (*&)

编辑

剖析处理器支持使用已解析的值作为结构化内容的键/值对。假设一个系统部分地以键/值对的形式记录日志。引用键允许您维护该键/值关系。

引用键修饰符示例

模式

[%{ts}] [%{level}] %{*p1}:%{&p1} %{*p2}:%{&p2}

输入

[2018-08-10T17:15:42,466] [ERR] ip:1.2.3.4 error:REFUSED

结果

  • ts = 2018-08-10T17:15:42,466
  • level = ERR
  • ip = 1.2.3.4
  • error = REFUSED