Импорт файлов JSON в Logstash + Elasticsearch + Kibana

Итак, у меня есть веб-платформа, которая печатает файл JSON для каждого запроса, содержащий некоторые данные журнала об этом запросе. Я могу настроить несколько правил о том, когда он должен регистрировать материал, только на определенных уровнях и т.д.

Теперь я играл с стеком Logstash + Elasticsearch + Kibana3, и мне бы хотелось найти способ увидеть эти журналы в Kibana. Мой вопрос в том, есть ли способ заставить Logstash импортировать такие файлы, или мне нужно написать для него настраиваемый входной плагин? Я искал вокруг и для того, что видел, плагины написаны на Ruby, языке, с которым у меня нет опыта.

Ответ 1

Logstash - это просто инструмент для преобразования различных типов файлов syslog в JSON и загрузки их в elasticsearch (или графит или...).

Так как ваши файлы уже находятся в JSON, вам не требуется logstash. Вы можете загрузить их прямо в elasticsearch с помощью curl.

См. Импорт/Индекс файла JSON в Elasticsearch

Однако, чтобы хорошо работать с Kibana, ваши файлы JSON должны быть как минимум.

  • Плоский - Kibana не вставляет вложенные структуры JSON. Вам нужен простой хэш пар ключ/значение.

  • Иметь идентификационную метку времени.

Что я хотел бы предложить, так это просмотр выходов logstash в файлах JSON и просмотр, если вы можете массировать файлы JSON в соответствии с этой структурой. Вы можете сделать это на любом языке, который вы как и поддержка JSON. Программа jq очень удобна для фильтрации json из одного формата в другой.

Формат Logstash - https://gist.github.com/jordansissel/2996677

jq - http://stedolan.github.io/jq/

Ответ 2

Logstash - очень хороший инструмент для обработки динамических файлов.

Вот способ импорта json файла в elasticsearch с помощью logstash:

конфигурационный файл:

input 
{
    file 
    {
        path => ["/path/to/json/file"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/
    {
        json { source => message }
    }

}

output
{ 
  elasticsearch {
    protocol => "http"
    codec => json
    host => "localhost"
    index => "json"
    embedded => true
  }

    stdout { codec => rubydebug }
}

пример json файла:

{"foo":"bar", "bar": "foo"}
{"hello":"world", "goodnight": "moon"}

Обратите внимание, что json должен быть в одной строке. если вы хотите проанализировать многострочный json файл, замените соответствующие поля в файле конфигурации:

   input 
{   
    file 
    {
        codec => multiline
        {
            pattern => '^\{'
            negate => true
            what => previous                
        }
        path => ["/opt/mount/ELK/json/*.json"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/ 
    {
        json { source => message }
    }

}

Ответ 3

Logstash может импортировать различные форматы и источники, поскольку он предоставляет множество плагинов. Существуют также другие инструменты для сбора журналов и форвардеров, которые могут отправлять журналы в logstash, такие как nxlog, rsyslog, syslog-ng, flume, kafka, fluentd и т.д. Из того, что я слышал, большинство людей используют nxlog для Windows (хотя он работает на Linux одинаково хорошо) в сочетании с стеком ELK из-за низкого ресурса. (Отказ от ответственности: я связан с проектом)