Як обробляти декілька різнорідних входів за допомогою Logstash?


95

Скажімо, у вас є 2 дуже різних типи журналів, таких як технічні та ділові журнали, і ви хочете:

  • необроблені технічні журнали перенаправляються до сервера Graylog2 за допомогою gelfвиводу,
  • Журнали бізнесу json зберігаються у кластрі еластичних пошуків за допомогою спеціального elasticsearch_httpвиводу.

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

Чи слід запускати стільки екземплярів, скільки журналів різних типів?


2
Ви повинні прийняти правильну відповідь Бен Ліма!
Ben Wheeler

Відповіді:


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 За документацією: Додайте поле 'type' до всіх подій, що обробляються цим входом. Типи використовуються в основному для активації фільтра. Тип зберігається як частина самої події, тому ви також можете використовувати його для пошуку у веб-інтерфейсі.
Тоні Чезаро,

5
Ну, схоже, те, що запропонував Бен, насправді є новим способом зробити це. Коли я використовував type => "value"у вихідних даних, на екрані з'явилося таке повідомлення: "Ви використовуєте застарілий параметр конфігурації" type ", встановлений у stdout. Застарілі налаштування продовжуватимуть працювати, але їх планується видалити з logstash в майбутньому. Ви можете досягти цього така сама поведінка з новими умовами, як:. if [type] == "sometype" { stdout { ... } }" Я відкликаю свій попередній коментар. :)
Тоні Чезаро,

Зверніть увагу, що typeатрибут не застосовуватиметься, якщо з вводу вже є поле типу. Це спеціальний атрибут, який не замінює, і він задокументований. Я відкрив квиток у Elastic, і вони рекомендували мені використовувати tagsабо add_fieldзамість цьогоtype
BornToCode

@BornToCode, я не зовсім розумію. Ви хочете сказати, що з кодом Бена щось не так? Або що це не спрацювало б, якби шляхи журналу були одним файлом? Який сценарій, коли це не працює?
Ben Wheeler

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. У таких випадках властивість "type" встановлюється на "log" і не може бути змінена.
Régis B.

Але хіба це не перезапис тегів останнім тегом (bbb)? І знову ж, у if statememt, якщо теги були масивом або одним рядком, тоді обидва IF працювали б. Тож логічно це неправильно, але, можливо, logstash має іншу логіку всередині if's
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"
    }
} 

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.