Как сгладить свойства json до _source used ELK?

#json #indexing #elastic-stack #flatten

#json #индексирование #elastic-stack #сгладить

Вопрос:

Предположим, у меня есть эти 2 сообщения журнала, отправленные в logstash / elasticsearch:

 {
    "events": [
        {
            "Message": "Get all motors",
            "Level": "Information"
        },
        {
            "Message": "Get all motors",
            "Level": "Information"
        }
    ]
}
  

Ожидаемый результат поиска:

 "hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1",
        "Message" : "Get all motors",
        "Level" : "Information"
      }
    },
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1",
        "Message" : "Get all motors",
        "Level" : "Information"
      }
    }
  ]
}
  

Я использовал приведенную ниже конфигурацию logstash:

 # Http input listening port 8080
input {
    http {  
        #default host 0.0.0.0:8080
        codec => json
    }
}

# Separate the logs
filter {
    split {
        field => "events"
        target => "e"
    }

    mutate {        
        remove_field => ["events", "headers"]
    }
}

# Send the logs to Elasticsearch
output {
    elasticsearch {
        hosts => "localhost:9200"
        index=>"mylog-%{ YYYY.MM.dd}"
        document_type => "log"
    }
}
  

Фактический результат поиска:

 "hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1",
        "e" : {
          "Message" : "Get all motors",
          "Level" : "Information"
        }
      }
    },
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1",
        "e" : {
          "Message" : "Get all motors",
          "Level" : "Information"
        }
      }
    }
  ]
}
  

Разница заключается в:

  • В фактическом результате информация моего журнала вложена в e свойство
  • Я хочу, чтобы все реквизиты журнала были сглажены (прямые дочерние элементы _source )

Документ Elasticsearch предлагает удалить target из filter :

 filter {
    split {
        field => "events"
    }
}
  

Но если я это сделаю, мой результат будет пустым:

 "hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1"
      }
    },
    {
      "_source" : {
        "@timestamp" : "2019-03-28T10:05:05.649Z",
        "@version" : "1"
      }
    }
  ]
}
  

Как я могу достичь ожидаемого результата?

Моя среда:

  • Windows 10 x64 Pro
  • ELK 6.7
  • JDK 8u201

Ответ №1:

удалите target => "e" часть, ваша цель — корень документа.

Комментарии:

1. Я пробовал это. Если я удалю его, информация журнала вообще не будет записана

2. Извините, я выразился недостаточно ясно, не удаляйте строку, но сделайте ее целевой для корня документа, а не «e»