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

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

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

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

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


person David    schedule 20.08.2013    source источник
comment
Вы должны принять правильный ответ Бена Лима!   -  person Ben Wheeler    schedule 19.09.2017


Ответы (3)


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

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

В файле конфигурации logstash вы можете указать для каждого ввода разные тип. Затем в фильтре вы можете использовать if чтобы различать разные обработки, а также на выходе вы можете использовать вывод «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
    }
}

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

person Ben Lim    schedule 13.12.2013
comment
Вы также можете использовать атрибут type (с тем же синтаксисом type => "value") в определениях фильтра и вывода, что должно немного сократить дополнительное форматирование в файле конфигурации. Пример: gist.github.com/fairchild/3030472 В документации: добавьте поле типа ко всем событиям, обрабатываемым этим входом. Типы используются в основном для активации фильтров. Тип сохраняется как часть самого события, поэтому вы также можете использовать тип для его поиска в веб-интерфейсе. - person Tony Cesaro; 29.03.2014
comment
Что ж, похоже, что то, что предложил Бен, на самом деле является новым способом сделать это. Когда я использовал type => "value" в выводе, у меня появилось следующее сообщение: Вы используете устаревший тип настройки конфигурации, установленный в stdout. Устаревшие настройки будут продолжать работать, но их планируется удалить из журнала в будущем. Вы можете добиться того же поведения с новыми условными выражениями, например: if [type] == "sometype" { stdout { ... } }. Я отказываюсь от своего предыдущего комментария. :) - person Tony Cesaro; 29.03.2014
comment
Обратите внимание, что атрибут type не будет применяться, если уже есть поле типа из ввода. Это специальный атрибут, который не имеет приоритетного значения, и он задокументирован. Я открыл заявку в Elastic, и мне посоветовали использовать tags или add_field вместо type - person BornToCode; 18.06.2017
comment
@BornToCode, я не совсем понимаю. Вы хотите сказать, что с кодом Бена что-то не так? Или это не сработало бы, если бы пути журналов были одним и тем же файлом? По какому сценарию это не работает? - person Ben Wheeler; 19.09.2017
comment
@BenWheeler - я говорю, что в сценарии, где уже есть поле типа (например, журнал поступил из службы filebeat, а filebeat был определен для добавления настраиваемого типа поля с некоторым значением), тогда код Бена не будет работать, потому что он проверяет if [type] == "technical" и это никогда не будет правдой, потому что значение типа всегда будет тем значением, которое существовало до того, как в игру вступил logstash. - person BornToCode; 24.09.2017
comment
@BenLim ОП не принял ваш ответ, но я нашел его очень полезным и поддержал вас. - person bigbadmouse; 03.01.2019
comment
Спасибо. Хотя все говорят, что это полезно, но OP не хотят принимать мой ответ. лолкс - person Ben Lim; 04.01.2019

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

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}"
        }
    }
}
person Robin Wang    schedule 02.11.2017
comment
Это лучше, чем принятый ответ: он позволяет вводить несколько файловых битов в logstash. В таких случаях свойство type устанавливается на log и не может быть изменено. - person Régis B.; 20.03.2018
comment
Но разве это не перезапись тегов последним тегом (bbb)? И опять же, в параметре if statememt, если бы теги были массивом или единственной строкой, тогда работали бы оба IF. Логически это неверно, но, возможно, у logstash другая логика внутри if - person meso_2600; 28.10.2018

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

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
person KM Prak    schedule 01.08.2017
comment
Да, столкнулся с той же проблемой - person meso_2600; 28.10.2018