Подтвердить что ты не робот

Использование JSON с LogStash

Я сойду с ума. У меня есть приложение, которое записывает журналы в файл. Каждая запись в журнале является объектом JSON. Пример моего .json файла выглядит следующим образом:

{"Property 1":"value A","Property 2":"value B"}
{"Property 1":"value x","Property 2":"value y"}

Я отчаянно пытаюсь получить записи журнала в LogStash. В попытке сделать это я создал следующий файл конфигурации LogStash:

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
    codec => "json"
  }
}
output {
  file {
    path => "/logs/out.log"
  }
}

Прямо сейчас, я вручную добавляю записи в mylogs.log, чтобы попытаться заставить его работать. Тем не менее, они появляются странно в stdout. Когда я смотрю open out.log, я вижу что-то вроде следующего:

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"}

Из-за этого, если я отправлю сообщение ElasticSearch, я не получу поля. Вместо этого я получаю беспорядочный беспорядок. Мне нужно, чтобы мои свойства все еще были свойствами. Я не хочу, чтобы они были переполнены частью сообщения или выходом. У меня есть подозрение, что это связано с кодеками. Тем не менее, я не уверен. Я не уверен, что я должен изменить кодек на конфигурацию входа в logstash. Или, если я должен изменить ввод на выходной конфигурации. Я искренне буду признателен за любую помощь, поскольку я сейчас отчаянно нуждаюсь.

БЛАГОДАРЯ.

4b9b3361

Ответ 1

Попробуйте удалить json-кодек и добавьте json filter

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
  }
}
filter{
    json{
        source => "message"
    }
}
output {
  file {
    path => "/logs/out.log"
  }
}

вам не нужен json-кодек, потому что вы не хотите декодировать исходный JSON, но хотите фильтровать вход для получения данных JSON только в поле @message.

Надеюсь, что это поможет.

Ответ 2

По умолчанию tcp помещает все в поле сообщения, если json-кодек не указан.

Обходное решение для _jsonparsefailure поля сообщения после того, как мы укажем json-кодек, также может быть исправлено, выполнив следующее:

input {
  tcp {
    port => '9563'
  }
}
filter{
  json{
    source => "message"
    target => "myroot"
  }
  json{
    source => "myroot"
  }

}
output {
    elasticsearch {
      hosts => [ "localhost:9200" ]
    }
}

Он будет анализировать поле сообщения для правильной строки json для поля myroot и затем myroot анализируется, чтобы дать json.

Мы можем удалить избыточное поле как сообщение как

filter {
  json {
    source => "message"
    remove_field => ["message"]
  }
}