Использование 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. Или, если я должен изменить ввод на выходной конфигурации. Я искренне буду признателен за любую помощь, поскольку я сейчас отчаянно нуждаюсь.
БЛАГОДАРЯ.
Ответы
Ответ 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"]
}
}