Logstash Parsing JSON сообщение

У меня ниже лог-сообщение, которое мне нужно отправить в logstash

{
  "timestamp": "2017-11-02T12:25:26+0000",
  "level": "INFO",
  "thread": "dw-28 - POST /transaction",
  "mdc": {
    "requestId": "a00460f8-b27d-4a53-bafb-f9a19fa3dedb"
  },
  "logger": "app.util.JsonLogUtil",
  "message": "{\"logMessage\":\"Transaction Created\", \"transactionId\":\"612632\", \"id\":\"17\", \"customerId\":\"null\", \"reason\":\"null\", \"currentOfferedDelta\":\"null\", \"updatedAmount\":\"null\", \"majorAmount\":\"null\"}",
  "context": "default"
}

Сообщение внутри поля сообщения снова json. Я хочу извлечь все его поля и добавить их как часть итогового документа. Для этого я добавил свой файл конфигурации logstash, как показано ниже ->

input {
  beats {
    port => 5044

  }
}

filter {     
    json{
        source => "message"
        target => "message"
    }         
}  

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    sniffing => true
    manage_template => false
    index => "test1"
    document_type => "%{[@metadata][type]}"
  }
}

Но вывод в упругом поиске ->

{
  "_index": "test1",
  "_type": "log",
  "_id": "AV-QtQKVpSHmBVb3JIlV",
  "_score": 1,
  "_source": {
    "message": {
      "timestamp": "2017-11-02T12:25:26+0000",
      "level": "INFO",
      "thread": "dw-28 - POST /transaction",
      "mdc": {
        "requestId": "a00460f8-b27d-4a53-bafb-f9a19fa3dedb"
      },
      "logger": "app.util.JsonLogUtil",
      "message": "{\"logMessage\":\"Transaction Created\", \"transactionId\":\"612632\", \"id\":\"17\", \"customerId\":\"null\", \"reason\":\"null\", \"currentOfferedDelta\":\"null\", \"updatedAmount\":\"null\", \"majorAmount\":\"null\"}",
      "context": "default"
    },
    "@version": "1",
    "@timestamp": "2017-11-06T09:40:13.066Z",
    "type": "log",
    "count": 1,
    "fields": null,
    "offset": 9010,
    "input_type": "log",
    "tags": [
      "beats_input_codec_plain_applied"
    ]
  }
}

Невозможно извлечь поля, такие как транзакция, идентификатор, причина. Любые входные данные будут высоко оценены.

1 ответ

Этот фильтр может помочь вам:

filter{
mutate{
    replace => [ "message", "%{message}" ]
    gsub => [ 'message','\n','']
}

if [message] =~ /^{.*}$/{
    json { source => message }
}

}

Другие вопросы по тегам