Как обрабатывать несколько гетерогенных входов с помощью Logstash?

Скажем, у вас есть 2 очень разных типа журналов, таких как технические и бизнес-журналы, и вы хотите:

  • необработанные технические журналы должны быть направлены к серверу graylog2 с использованием вывода gelf,
  • Журналы бизнес-процессов json сохраняются в кластере elasticsearch, используя выделенный вывод elasticsearch_http.

Я знаю, что, например, с Syslog-NG, файл конфигурации позволяет определять несколько разных входов, которые затем могут обрабатываться отдельно перед отправкой; что Logstash кажется неспособным сделать. Даже если один экземпляр может быть инициирован с двумя конкретными файлами конфигурации, все журналы берут один и тот же канал и применяются одни и те же процессы...

Должен ли я запускать столько экземпляров, сколько у меня есть разные типы журналов?

Ответ 1

Должен ли я запускать столько экземпляров, сколько у меня есть разные типы журналов?

Нет! Вы можете запускать только один экземпляр для обработки различных типов журналов.

В файле конфигурации logstash вы можете указать каждый вход с помощью type. Затем в фильтре вы можете использовать если для отличной обработки, а также на выходе вы можете использовать вывод "if" для другого адресата.

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

Надеюсь, это может вам помочь:)

Ответ 2

Я использовал теги для ввода нескольких файлов:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}

Ответ 3

Я думаю, что logstash не может читать более двух файлов в разделе "Enter". попробуйте ниже

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
}