Несколько фильтров Grok не сохраняют запись совпадения первого фильтра

Я использую Logstash для анализа журналов postfix. Я в основном сосредоточен, чтобы получить отсканированные журналы электронной почты из журналов постфикса и хранить их в базе данных.

Чтобы получить журналы, сначала мне нужно найти идентификатор, сгенерированный postfix, соответствующий моему идентификатору сообщения, и используя этот идентификатор, мне нужно найти статус электронной почты. Для последующей настройки я могу получить журналы.

grok {
       patterns_dir => "patterns"
       match => [
            "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}",
            "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
        ]
        named_captures_only => true
    }

Я использую следующее условие для хранения журналов, соответствующих шаблонам:

if "_grokparsefailure" not in [tags] {
   #database call
}

Как вы видели, я использую два шаблона для поиска соответствующих двух разных журналов из одного файла журнала.

Теперь я хочу различать оба шаблона на основе тегов. Поэтому я изменил свою конфигурацию следующим образом:

  grok {
       patterns_dir => "patterns"
       match => [
            "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
        ]
        add_tag => ["BOUNCED"]
        remove_tag => ["_grokparsefailure"]
        named_captures_only => true
    }

    grok {
       patterns_dir => "patterns"
       match => [
            "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"            
        ]
        add_tag => ["INTIALIZATION"]
        remove_tag => ["_grokparsefailure"]
        named_captures_only => true
    }

Теперь он хранит журналы шаблонов% {POSTFIXCLEANUP}. Если я отменил порядок, он сохранит шаблон% {POSTFIXBOUNCE}.

поэтому, после удаления этого условия if, я обнаружил, что сообщение, обрабатываемое из первого фильтра, имеет тег "_grokparsefailure" и первый тег фильтра, и из-за этого он не сохраняет эту запись.

Может ли кто-нибудь сказать мне, что нужно сделать, чтобы исправить это? Я ошибаюсь?

Ответ 1

Вам нужно защитить второй блок grok, т.е. не выполнять его, если первый успешно.

if ("BOUNCED" not in [tags]) {
  grok {
    patterns_dir => "patterns"
    match => [
        "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"            
    ]
    add_tag => ["INTIALIZATION"]
    remove_tag => ["_grokparsefailure"]
    named_captures_only => true
  }
}