使用嵌套 JSON 改变 logstash 中的数据
Mutate data in logstash with nested JSON
下面是我正在处理的示例日志条目 (JSON):
{
"Order": {
"content": {
"seqnum": "107",
"type": "DAIRY",
"section": "A1",
"time": "2022-03-02T14:21:45",
"version": "24",
"src": "EAST",
"status": "3"
},
"crc": {
"crcvalue": "45BD2E93"
}
}
},
下面是我的 logstash 过滤器。
filter {
json {
source => "message"
}
mutate { add_field => { "Order_Version" => "%{Order.content.version}" } }
mutate { add_field => { "Order_State" => "%{Order.content.status}" } }
mutate { convert => { "Order_Version" => "integer" } }
mutate { convert => { "Order_State" => "integer" } }
if [Order_State] == 3
{
mutate {
add_field => { "Order_State" => "Processing" }
}
}
if [Order_State] == 1
{
mutate {
add_field => { "Order_State" => "Shipped" }
}
}
if [Order_State] == 4
{
mutate {
add_field => { "Order_State" => "Pending" }
}
}
mutate { remove_field => ["message", "@timestamp", "path", "host", "@version", "Order.content.version", "Order.content.status", "Order.content.seqnum", "crcvalue"] }
}
当我应用上面的过滤器时,我能够将所有数据正确解析为字段,但是当我尝试改变数据时,我无法使用“if”条件添加新字段。我不确定,但是“版本”和“状态”字段中的数据不会添加到新字段中。虽然正在创建新字段,但它们都只有“0”,可能是因为我正在将它们转换为整数。 “remove_field” 仅适用于 elastic 生成的字段,而不适用于 json 消息字段。
下面是elastic
的数据
#_Data in Elastic
{
"_index" : "order-sample-1",
"_type" : "_doc",
"_id" : "uXh-a38ByXB23tWqi2r3",
"_score" : 1.0,
"_source" : {
"Order" : {
"content" : {
"section" : "A1",
"src" : "EAST",
"status" : "3",
"seqnum" : "107",
"time" : "2022-03-07T14:21:45",
"version" : "24"
},
"crc" : {
"crcvalue" : "45BD2E93"
}
},
"Order_State" : 0,
"Order_Version" : 0
}
},
#_fields on the kibana
Order.content.seqnum: 107
Order.content.type: DAIRY
Order.content.section: A1
Order.content.time: 2022-03-02T14:21:45
Order.content.version: 24
Order.content.src: EAST
Order.content.status: 3
Order.crc.crcvalue: 45BD2E93
如何 copy/use json 字段的内容并将其放入新字段?或者我应该只使用 gsub 并替换字段的内容?
我想要实现的是如下所示并删除其余字段。
section: A1
time: 2022-03-02T14:21:45
src: EAST
Order_Version: 24
Order_State: Processing
感谢任何帮助。谢谢。
对于对象 { "Order" : { "content" : { "section" : "A1" } } }
elasticsearch 和 kibana 将使用 Order.content.section.
引用它
logstash 使用语法 [Order][content][section]。这样做的好处是,如果您有另一个对象 { "Order" : { "content.section" : "A1" } }
,那么 logstash 可以明确地区分 [Order][content][section] 和 [Order][content.section].
因此在 mutate 中使用“%{[Order][content][version]}”等
下面是我正在处理的示例日志条目 (JSON):
{
"Order": {
"content": {
"seqnum": "107",
"type": "DAIRY",
"section": "A1",
"time": "2022-03-02T14:21:45",
"version": "24",
"src": "EAST",
"status": "3"
},
"crc": {
"crcvalue": "45BD2E93"
}
}
},
下面是我的 logstash 过滤器。
filter {
json {
source => "message"
}
mutate { add_field => { "Order_Version" => "%{Order.content.version}" } }
mutate { add_field => { "Order_State" => "%{Order.content.status}" } }
mutate { convert => { "Order_Version" => "integer" } }
mutate { convert => { "Order_State" => "integer" } }
if [Order_State] == 3
{
mutate {
add_field => { "Order_State" => "Processing" }
}
}
if [Order_State] == 1
{
mutate {
add_field => { "Order_State" => "Shipped" }
}
}
if [Order_State] == 4
{
mutate {
add_field => { "Order_State" => "Pending" }
}
}
mutate { remove_field => ["message", "@timestamp", "path", "host", "@version", "Order.content.version", "Order.content.status", "Order.content.seqnum", "crcvalue"] }
}
当我应用上面的过滤器时,我能够将所有数据正确解析为字段,但是当我尝试改变数据时,我无法使用“if”条件添加新字段。我不确定,但是“版本”和“状态”字段中的数据不会添加到新字段中。虽然正在创建新字段,但它们都只有“0”,可能是因为我正在将它们转换为整数。 “remove_field” 仅适用于 elastic 生成的字段,而不适用于 json 消息字段。 下面是elastic
的数据#_Data in Elastic
{
"_index" : "order-sample-1",
"_type" : "_doc",
"_id" : "uXh-a38ByXB23tWqi2r3",
"_score" : 1.0,
"_source" : {
"Order" : {
"content" : {
"section" : "A1",
"src" : "EAST",
"status" : "3",
"seqnum" : "107",
"time" : "2022-03-07T14:21:45",
"version" : "24"
},
"crc" : {
"crcvalue" : "45BD2E93"
}
},
"Order_State" : 0,
"Order_Version" : 0
}
},
#_fields on the kibana
Order.content.seqnum: 107
Order.content.type: DAIRY
Order.content.section: A1
Order.content.time: 2022-03-02T14:21:45
Order.content.version: 24
Order.content.src: EAST
Order.content.status: 3
Order.crc.crcvalue: 45BD2E93
如何 copy/use json 字段的内容并将其放入新字段?或者我应该只使用 gsub 并替换字段的内容?
我想要实现的是如下所示并删除其余字段。
section: A1
time: 2022-03-02T14:21:45
src: EAST
Order_Version: 24
Order_State: Processing
感谢任何帮助。谢谢。
对于对象 { "Order" : { "content" : { "section" : "A1" } } }
elasticsearch 和 kibana 将使用 Order.content.section.
logstash 使用语法 [Order][content][section]。这样做的好处是,如果您有另一个对象 { "Order" : { "content.section" : "A1" } }
,那么 logstash 可以明确地区分 [Order][content][section] 和 [Order][content.section].
因此在 mutate 中使用“%{[Order][content][version]}”等