Logstash 如何使用egrok从log4j记录解析内部json部分

Logstash 如何使用egrok从log4j记录解析内部json部分,logstash,elastic-stack,logstash-grok,filebeat,kibana-5,Logstash,Elastic Stack,Logstash Grok,Filebeat,Kibana 5,这是filebeat提供的我的输入log4j行 2017-07-02 08:46:28,702 INFO com.company.service.EventService - Consumed event: { "details": { "A": 10, "B": "EUR" }, "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl", "eventArrivalTime": "2017-07-02T08:46:28.700

这是filebeat提供的我的输入log4j行

2017-07-02 08:46:28,702 INFO  com.company.service.EventService - Consumed event: {
  "details": {
    "A": 10,
    "B": "EUR"
  },
  "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl",
  "eventArrivalTime": "2017-07-02T08:46:28.700Z"
}
我设法删除了
2017-07-02 08:46:28702信息部分
(将其映射到字段:
msgbody
),现在我试图将json部分从中解析到kibana上的字段中

我想将事件{..}内的字段索引到kibana中,例如eventId details

这就是我到目前为止所做的,我不知道如何提取这个json

filter {
  if [type] == "log" {
    grok {
       match => {
        "message" => "%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel} %{GREEDYDATA:msgbody}"
      }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]
    }
  }
}

谢谢

msgbody
是使用过滤器中的
GREEDYDATA
映射的,这与新行不匹配。这意味着您的
msgbody
将只匹配
com.company.service.EventService-consumered事件:{

您需要将
INFO
直到
},
之后的所有内容映射到一个单独的字段中,可以使用

(?m)%{DATA:msgbody}\},
它会匹配的

"msgbody": [
    [
      "  com.company.service.EventService - Consumed event: {\n  "details": {\n    "A": 10,\n    "B": "EUR"\n  "
    ]
  ]
其余数据,即

  "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl",
  "eventArrivalTime": "2017-07-02T08:46:28.700Z"
需要在其自身的块中进行匹配,以便可以使用
json
过滤器对其进行过滤

%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel}(?m)%{DATA:msgbody}\},%{GREEDYDATA:json}
这将产生,

  "msgbody": [
    [
      "  com.company.service.EventService - Consumed event: {\n  "details": {\n    "A": 10,\n    "B": "EUR"\n  "
    ]
  ],
  "json": [
    [
      "\n  "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl",\n  "eventArrivalTime": "2017-07-02T08:46:28.700Z"\n}"
    ]
  ]
现在我们将json字段添加到一个名为
json
的新字段中

json过滤器可以应用于它,如下所示:

json{
    source => "json"
    target => "parsed_json"
}

希望这对您有所帮助

msgbody
是使用过滤器中的
GREEDYDATA
进行映射的,它不会匹配新行。这意味着您的
msgbody
将只匹配
com.company.service.EventService-consumered事件:{

您需要将
INFO
直到
},
之后的所有内容映射到一个单独的字段中,可以使用

(?m)%{DATA:msgbody}\},
它会匹配的

"msgbody": [
    [
      "  com.company.service.EventService - Consumed event: {\n  "details": {\n    "A": 10,\n    "B": "EUR"\n  "
    ]
  ]
其余数据,即

  "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl",
  "eventArrivalTime": "2017-07-02T08:46:28.700Z"
需要在其自身的块中进行匹配,以便可以使用
json
过滤器对其进行过滤

%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel}(?m)%{DATA:msgbody}\},%{GREEDYDATA:json}
这将产生,

  "msgbody": [
    [
      "  com.company.service.EventService - Consumed event: {\n  "details": {\n    "A": 10,\n    "B": "EUR"\n  "
    ]
  ],
  "json": [
    [
      "\n  "eventId": "45YHJAIBpPeExHtskhqRbTDI9oEk2wPl",\n  "eventArrivalTime": "2017-07-02T08:46:28.700Z"\n}"
    ]
  ]
现在我们将json字段添加到一个名为
json
的新字段中

json过滤器可以应用于它,如下所示:

json{
    source => "json"
    target => "parsed_json"
}

希望这有帮助

请查看更新的答案请查看更新的答案