解析处理器编辑

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

false

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

description

-

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

if

-

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

ignore_failure

false

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

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 个空格),因为模式只有一个空格,而源字符串有两个空格。

右侧填充修饰符有助于解决此问题。在模式 %{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