Проблема с разделением массива Json Конфигурация Logstash: Неожиданный конец ввода: ожидаемый маркер закрытия для массива (начальный маркер в [Источник: (S

Вот как выглядит мой объект json, я убедился, что json, который я получаю, является действительным. Я пытаюсь настроить файлы конфигурации для одного и того же, но всегда получаю ту же ошибку

Ошибка разбора SON, исходные данные теперь в поле сообщения {:error=>#, :data=>"{\"total_rows\":15587,\"offset\":0,\"rows\":[\r"} [2019-08-05T21:07:49,799][WARN ][logstash.filters.split ] Разделяемы только типы String и Array. field:[doc][serversGroups] имеет тип = NilClass [2019-08-05T21:07:50,584][WARN ][logstash.filters.split ] Разделяемы только типы String и Array. field:[doc][serversGroups][ActiveUsers] имеет тип = NilClass

Это мой исходный файл конфигурации, который я использую для logstash.

filter {

json {
source => "message"
skip_on_invalid_json => "true"
target => "doc"
}

split {

field => "[doc][serversGroups]"

}

split {

field => "[doc][serversGroups][ActiveUsers]"
}

date {
      match => [ "[doc][date]", "UNIX" ]
      target => "unix_time"
    }

mutate {
      convert => { "[doc][serversGroups][ActiveUsers][handle]" => "integer"
                   "[doc][serversGroups][list][UsedLicenses]" => "integer"
                   "[doc][serversGroups][list][issuedLicenses]" => "integer"
      }
    }

fingerprint {
concatenate_all_fields => "true"
method => "SHA256"
target => "fingerprint"
  }
}

output {

stdout {
codec => "rubydebug"
}

elasticsearch {
hosts => ["localhost:9200"]
index => "pyyython"
codec => "json"
document_id => "%{[fingerprint]}"
}


}

Это мой исходный JSON

{
  "total_rows": 156122,
  "offset": 12,
  "rows": [
    {
      "id": "12345",
      "key": "12345",
      "value": {
        "rev": "1-12345"
      },
      "doc": {
        "_id": "12345",
        "_rev": "1-12345",
        "date": "15645348122",
        "HostServerName": "abc.com",
        "serversGroups": [
          {
            "ServiceName": "--- ",
            "list": {
              "issuedLicenses": "123",
              "UsedLicenses": "12"
            },
            "ActiveUsers": [
              {}
            ]
          },
          {
            "ServiceName": "--- ",
            "list": {
              "issuedLicenses": "123",
              "UsedLicenses": "12"
            },
            "ActiveUsers": [
              {}
            ]
          },
          {
            "ServiceName": "--- ",
            "list": {
              "issuedLicenses": "123",
              "UsedLicenses": "12"
            },
            "ActiveUsers": [
              {}
            ]
          },
          {
            "ServiceName": "--- ",
            "list": {
              "issuedLicenses": "123",
              "UsedLicenses": "1"
            },
            "ActiveUsers": [
              {
                "user": "me",
                "user_host": "myself",
                "dispay": "andI",
                "version": "v1.1",
                "server_host": "testing.abc.com",
                "handle": "12345",
                "last_date_license_check": "7/7",
                "last_time_license_check": "12:12"
              }
            ]
          }
        ]
      }
    }
  ]
}

Я продолжаю получать эту ошибку

SON parse error, original data now in message field {:error=>#<LogStash::Json::ParserError: Unexpected end-of-input: expected close marker for Array (start marker at [Source: (S"; line: 1, column: 39])87,"offset":0,"rows":[
"; line: 2, column: 41]>, :data=>"{\"total_rows\":15587,\"offset\":0,\"rows\":[\r"}
[2019-08-05T21:07:49,799][WARN ][logstash.filters.split   ] Only String and Array types are splittable. field:[doc][serversGroups] is of type = NilClass
[2019-08-05T21:07:50,584][WARN ][logstash.filters.split   ] Only String and Array types are splittable. field:[doc][serversGroups][ActiveUsers] is of type = NilClass

не уверен, что мое разделение неправильно!


person vignesh harish    schedule 06.08.2019    source источник


Ответы (1)


Исходный JSON, который вы показываете, явно недействителен, так как он заканчивается запятой. Если заменить запятую на

]
}
}
]
}

тогда это действительно. После внесения этого изменения его можно разделить с помощью

split { field => "[doc][rows][0][doc][serversGroups]" }
split { field => "[doc][rows][0][doc][serversGroups][ActiveUsers]" }
person Badger    schedule 06.08.2019
comment
У меня есть закрывающие фигурные скобки, это не проблема! Это файл размером 150+ мб с таким типом структурирования! - person vignesh harish; 06.08.2019
comment
Что-то не так с тем, как я отформатировал файл конфигурации? - person vignesh harish; 06.08.2019
comment
Только то, что вы пытаетесь разделить несуществующие поля. - person Badger; 06.08.2019
comment
нет, именно так выглядит мой файл JSON, в котором все больше и больше объектов вложены в массивы. Я не могу разделить [строки] [0], так как в них более 15 тысяч объектов, и они динамически увеличиваются! - person vignesh harish; 06.08.2019
comment
Если вам нужно разделить каждый элемент массива, вам придется написать это на рубине. - person Badger; 07.08.2019
comment
не могли бы вы предоставить мне пример того, как это будет выглядеть? - person vignesh harish; 07.08.2019