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

95

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

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

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

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

Дэвид
источник
2
Вы должны принять правильный ответ Бена Лима!
Бен Уиллер

Ответы:

191

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

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

В файле конфигурации 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
    }
}

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

Бен Лим
источник
1
Вы также можете использовать typeатрибут (с тем же type => "value"синтаксисом) в определениях фильтра и вывода, что должно немного сократить дополнительное форматирование в файле конфигурации. Пример: gist.github.com/fairchild/3030472 В документации: добавьте поле «тип» ко всем событиям, обрабатываемым этим входом. Типы используются в основном для активации фильтров. Тип сохраняется как часть самого события, поэтому вы также можете использовать этот тип для его поиска в веб-интерфейсе.
Тони Чезаро
5
Что ж, похоже, что то, что предложил Бен, на самом деле является новым способом сделать это. Когда я использовал type => "value"в выводе, у меня появилось следующее сообщение: «Вы используете устаревший параметр конфигурации» type, установленный в stdout. Устаревшие настройки будут продолжать работать, но их планируется удалить из logstash в будущем. Вы можете добиться такое же поведение с новыми условными выражениями, например:. if [type] == "sometype" { stdout { ... } }" Я отказываюсь от своего предыдущего комментария. :)
Тони Чезаро
Обратите внимание, что typeатрибут не будет применяться, если уже есть поле типа из ввода. Это специальный атрибут, который не отменяет, и он задокументирован. Я открыл тикет в Elastic, и мне порекомендовали использовать tagsили add_fieldвместоtype
BornToCode
@BornToCode, я не совсем понимаю. Вы хотите сказать, что с кодом Бена что-то не так? Или это не сработало бы, если бы пути к журналам были одним и тем же файлом? По какому сценарию это не работает?
Бен Уиллер
2
@BenLim ОП не принял ваш ответ, но я нашел его очень полезным и поддержал вас.
bigbadmouse
15

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

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}"
        }
    }
}
Робин Ван
источник
Это лучше, чем принятый ответ: он позволяет вводить несколько файловых битов в logstash. В таких случаях для свойства «тип» устанавливается значение «журнал», и его нельзя изменить.
Режис Б.
Но разве это не перезапись тегов последним тегом (bbb)? И опять же, в параметре if statememt, если бы теги были массивом или одной строкой, тогда работали бы оба IF. Так что логически это неверно, но, возможно, у logstash другая логика внутри if
meso_2600
0

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

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
источник
Ага, столкнулся с той же проблемой
meso_2600