字段引用深入

编辑

能够通过名称引用字段或字段集合通常很有用。为此,您可以使用 Logstash 字段引用语法。

访问字段的语法指定了字段的完整路径,每个片段都用方括号括起来。当字段名称包含方括号时,必须正确转义

字段引用可以在管道配置中的条件语句中直接表达,作为管道插件的字符串参数,或者在管道插件将使用的 sprintf 语句中表达。

filter {
  #  +----literal----+     +----literal----+
  #  |               |     |               |
  if [@metadata][date] and [@metadata][time] {
    mutate {
      add_field {
        "[@metadata][timestamp]" => "%{[@metadata][date]} %{[@metadata][time]}"
      # |                      |    |  |               |    |               | |
      # +----string-argument---+    |  +--field-ref----+    +--field-ref----+ |
      #                             +-------- sprintf format string ----------+
      }
    }
  }
}

形式语法

编辑

以下是字段引用的形式语法,其中包含注释和示例。

字段引用字面量

编辑

字段引用字面量是一个或多个路径片段的序列,可以直接在 Logstash 管道条件语句中使用,无需任何额外的引号(例如 [request][response][status])。

fieldReferenceLiteral
  : ( pathFragment )+
  ;

在 Logstash 7.x 及更早版本中,带引号的值(例如 ["foo"])被视为字段引用,而不是被视为单个元素数组。这种行为可能会在条件语句中造成混淆,例如 [message] in ["foo", "bar"][message] in ["foo"] 的比较。我们不建议使用带引号的名称,例如 "\"foo\"",因为这种行为将来可能会改变。

字段引用(事件 API)

编辑

事件 API 用于操作事件字段或使用 sprintf 语法的方法比管道语法更灵活,因为它接受的内容作为字段引用。可以 通过其字段名称直接引用顶级字段,无需方括号,并且对复合字段引用有一定的支持,简化了程序生成的字段引用的使用。

因此,用于事件 API 的字段引用是:

  • 单个字段引用字面量;或
  • 单个字段名称(引用顶级字段);或
  • 单个复合字段引用
eventApiFieldReference
  : fieldReferenceLiteral
  | fieldName
  | compositeFieldReference
  ;

路径片段

编辑

路径片段是用方括号括起来的字段名称(例如 [request])。

pathFragment
  : '[' fieldName ']'
  ;

字段名称

编辑

字段名称不是方括号 ([]) 的字符序列。

fieldName
  : ( ~( '[' | ']' ) )+
  ;

复合字段引用

编辑

在某些情况下,可能需要通过编程方式组合一个或多个字段引用来组成字段引用,例如在插件中操作字段时,或者在使用 Ruby 过滤器插件和事件 API 时。

    fieldReference = "[path][to][deep nested field]"
    compositeFieldReference = "[@metadata][#{fieldReference}][size]"
    # => "[@metadata][[path][to][deep nested field]][size]"
复合字段引用的规范表示
编辑
可接受的复合字段引用 规范的字段引用表示

+[[deep][nesting]][field]+

+[deep][nesting][field]+

+[foo][[bar]][bingo]+

+[foo][bar][bingo]+

+[[ok]]+

+[ok]+

复合字段引用是一个或多个路径片段嵌入式字段引用的序列。

compositeFieldReference
  : ( pathFragment | embeddedFieldReference )+
  ;

复合字段引用受事件 API 支持,但不受管道配置中的字面量支持。

嵌入式字段引用

编辑
embeddedFieldReference
  : '[' fieldReference ']'
  ;

嵌入式字段引用是用方括号 ([]) 括起来的字段引用,可以是复合字段引用的组成部分。

转义序列

编辑

为了让 Logstash 引用名称中包含字段引用语法中具有特殊含义的字符的字段,必须转义该字符。Logstash 可以全局配置为使用两种字段引用转义模式之一。

  • none(默认):不进行转义序列处理。事件 API 无法引用包含字面方括号的字段。
  • percent:UTF-8 字节的 URI 样式百分比编码。左方括号 ([) 表示为 %5B,右方括号 (]) 表示为 %5D
  • ampersand:HTML 样式的与号编码 (&# + 十进制 Unicode 代码点 + ;)。左方括号 ([) 表示为 [,右方括号 (]) 表示为 ]