当事件和 logstash 输入都提供值时避免 'type' 键冲突
Avoid collision of 'type' key when both event and logstash input provide values
我正在尝试编写一个管道来将文件加载到 logstash 中。我的设置需要将输入部分中的 type
字段指定为 Run multiple independent logstash config files with input,filter and output。不幸的是,源数据已经包含字段 type
,并且看起来源数据中的值与输入配置中提供的值冲突。
源数据包含一个 json 数组,如下所示
[
{"key1":"obj1", "type":"looks like a bad choose for a key name"},
{"key1":"obj2", "type":"you can say that again"}
]
我的管道如下所示
input {
exec {
command => "cat /path/file_containing_above_json_array.txt"
codec => "json"
type => "typeSpecifiedInInput"
interval => 3600
}
}
output {
if[type] == "typeSpecifiedInInput" {
stdout {
codec => rubydebug
}
}
}
永远不会调用输出,因为 type
已设置为源数据提供的值而不是输入部分提供的值。
如何设置输入管道以避免这种冲突?
内森
在您的输入中创建一个新字段而不是重复使用 'type'。 exec{} 输入有 add_field 可用。
下面是使用 add_field
而不是 type
的最终管道。添加了一个过滤阶段来清理文档,以便 type
字段包含写入 ElasticSearch (class of similar documents) 所需的预期值。原始 JSON 文档中的 type
值保留在键 typeSpecifiedFromDoc
中 变异步骤必须分成不同的阶段,以便替换不会影响 type
原始值已添加为新字段 typeSpecifiedFromDoc
.
input {
exec {
command => "cat /path/file_containing_above_json_array.txt"
codec => "json"
add_field => ["msgType", "typeSpecifiedInInput"]
interval => 3600
}
}
filter {
if[msgType] == "typeSpecifiedInInput" {
mutate {
add_field => ["typeSpecifiedFromDoc", "%{type}"]
}
mutate {
replace => ["type", "%{msgType}"]
remove_field => ["msgType"]
}
}
}
output {
if[type] == "typeSpecifiedInInput" {
stdout {
codec => rubydebug
}
}
}
我正在尝试编写一个管道来将文件加载到 logstash 中。我的设置需要将输入部分中的 type
字段指定为 Run multiple independent logstash config files with input,filter and output。不幸的是,源数据已经包含字段 type
,并且看起来源数据中的值与输入配置中提供的值冲突。
源数据包含一个 json 数组,如下所示
[
{"key1":"obj1", "type":"looks like a bad choose for a key name"},
{"key1":"obj2", "type":"you can say that again"}
]
我的管道如下所示
input {
exec {
command => "cat /path/file_containing_above_json_array.txt"
codec => "json"
type => "typeSpecifiedInInput"
interval => 3600
}
}
output {
if[type] == "typeSpecifiedInInput" {
stdout {
codec => rubydebug
}
}
}
永远不会调用输出,因为 type
已设置为源数据提供的值而不是输入部分提供的值。
如何设置输入管道以避免这种冲突?
内森
在您的输入中创建一个新字段而不是重复使用 'type'。 exec{} 输入有 add_field 可用。
下面是使用 add_field
而不是 type
的最终管道。添加了一个过滤阶段来清理文档,以便 type
字段包含写入 ElasticSearch (class of similar documents) 所需的预期值。原始 JSON 文档中的 type
值保留在键 typeSpecifiedFromDoc
中 变异步骤必须分成不同的阶段,以便替换不会影响 type
原始值已添加为新字段 typeSpecifiedFromDoc
.
input {
exec {
command => "cat /path/file_containing_above_json_array.txt"
codec => "json"
add_field => ["msgType", "typeSpecifiedInInput"]
interval => 3600
}
}
filter {
if[msgType] == "typeSpecifiedInInput" {
mutate {
add_field => ["typeSpecifiedFromDoc", "%{type}"]
}
mutate {
replace => ["type", "%{msgType}"]
remove_field => ["msgType"]
}
}
}
output {
if[type] == "typeSpecifiedInInput" {
stdout {
codec => rubydebug
}
}
}