字段引用深入
编辑字段引用深入编辑
能够通过名称引用字段或字段集合通常很有用。为此,您可以使用 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 Filter 插件和事件 API 时。
fieldReference = "[path][to][deep nested field]" compositeFieldReference = "[@metadata][#{fieldReference}][size]" # => "[@metadata][[path][to][deep nested field]][size]"
复合字段引用的规范表示编辑
可接受的复合字段引用 | 规范的字段引用表示 |
---|---|
|
|
|
|
|
|
复合字段引用是一个或多个路径片段或嵌入式字段引用的序列。
compositeFieldReference : ( pathFragment | embeddedFieldReference )+ ;
事件 API 支持复合字段引用,但不支持在管道配置中作为文字使用。
嵌入式字段引用编辑
embeddedFieldReference : '[' fieldReference ']' ;
嵌入式字段引用是用方括号 ([
和 ]
) 括起来的字段引用,可以是复合字段引用的组成部分。
转义序列编辑
为了让 Logstash 引用名称包含字段引用语法中具有特殊含义的字符的字段,必须对该字符进行转义。可以全局配置 Logstash 以使用两种字段引用转义模式之一
-
none
(默认):不执行转义序列处理。包含文字方括号的字段无法通过事件 API 引用。 -
percent
:UTF-8 字节的 URI 样式百分比编码。左方括号 ([
) 表示为%5B
,右方括号 (]
) 表示为%5D
。 -
ampersand
:HTML 样式的与号编码 (&#
+ 十进制 Unicode 代码点 +;
)。左方括号 ([
) 表示为[
,右方括号 (]
) 表示为]
。