Logstash 如何使用egrok从log4j记录解析内部json部分
这是filebeat提供的我的输入log4j行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
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"
}
希望这有帮助请查看更新的答案请查看更新的答案