Подтвердить что ты не робот

Как обрабатывать несогласованные фильтры Logstash grok

Мне интересно, что лучше всего подходит для моих фильтров Logstash Grok. У меня есть некоторые фильтры, которые предназначены для определенных записей в журнале, и не будут применяться ко всем записям. Те, которые не применяются, всегда генерируют теги _grokparsefailure. Например, у меня есть один фильтр grok, который для каждой записи в журнале работает нормально. Затем у меня есть еще один фильтр, который для сообщений об ошибках с отслеживанием. Фильтр трассировки выдает grokparsefailure для каждой записи в журнале, которая не имеет трассировки.

Я бы предпочел, чтобы он просто передал правило, если нет совпадения вместо добавления тега parsefailure. Я использую тег parsefailure, чтобы найти вещи, которые не разбираются правильно, а не вещи, которые просто не соответствуют определенному фильтру. Может быть, это только номенклатура "неудачи разбора", которая меня достает. Для меня это означает, что с фильтром что-то не так (например, плохо отформатировано), а не то, что оно не соответствует.

Итак, вопрос в том, как я должен справиться с этим?

  • Сделайте шаблон фильтра дополнительным, используя?

  • (ab) используйте параметр tag_on_failure, установив его на ничего []

  • сделать фильтр условным, используя что-то вроде "if traceback in message"

  • что-то еще я не рассматриваю?

Спасибо заранее.

ИЗМЕНИТЬ

Я взял путь добавления условия вокруг фильтра:

    if [message] =~ /took\s\d+/ {
        grok {
            patterns_dir => "/etc/logstash/patterns"
            match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
            add_tag => [ "stats", "servicetime" ]
        }
    }

Тем не менее, он заинтересован в обратной связи. Что здесь считается "лучшей практикой"?

4b9b3361

Ответ 1

Когда это возможно, я бы включил условную оболочку как тот, который вы используете. Не стесняйтесь публиковать это как ответ!

Если ваше приложение создает только несколько разных форматов строк, вы можете использовать несколько шаблонов соответствия с grok filter. По умолчанию фильтр обработает до первого успешного совпадения:

grok {
    patterns_dir => "./patterns"
    match => [
        "message", "%{BASE_PATTERN} %{EXTRA_PATTERN}",
        "message", "%{BASE_PATTERN}",
        "message", "%{SOME_OTHER_PATTERN}"
    ]
}

Если ваша логика менее проста (возможно, вам нужно проверить одно и то же условие более одного раза), grep filter может быть полезен для добавления тег. Что-то вроде этого:

grep {
    drop => false #grep normally drops non-matching events
    match => ["message", "/took\s\d+/"]
    add_tag => "has_traceback"
}


...

if "has_traceback" in [tags] {
    ...
}

Ответ 2

Вы также можете добавить tag_on_failure => [] к своей строфе, например:

grok {
    match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
    tag_on_failure => [ ]
}

grok все равно будет терпеть неудачу, но сделает это без добавления массива тегов.

Ответ 3

Вы также можете сделать это

remove_tag = > [ "_grokparsefailure" ]

всякий раз, когда у вас есть соответствие.

Ответ 4

Это самый эффективный способ сделать это. Игнорировать фильтр

filter {

        grok {
            match => [ "message", "something"]
    }

    if "_grokparsefailure" in [tags] {
            drop { }
        }
}