ELK Журналы из приложения исчезают при включении правил grok

У нас есть два экземпляра приложения (одно и то же приложение, другая база данных), давайте назовем их app1 и app2. Маршрут, по которому идут журналы:

  1. appX запускает filebeat, который берет файл журнала приложений с тегами appX и отправляет каждую запись в экземпляр logstash в кластере rabbitmq. Затем его добавляют в rabbitmq.
  2. Сообщение проходит через кластер rabbitmq и используется другим экземпляром logstash, который запускает различные фильтры в зависимости от тега.
  3. Тот же экземпляр logstash отправляет полученную строку журнала в эластичный поиск.

Все хорошо. В случае app1 & 2 фильтры - это грок, который разбивает сообщение на поля, по которым мы затем можем искать.

app1 работает, журналы обрабатываются фильтром и отображаются в правильном индексе в asticsearch, как и ожидалось.

app2 не работает. Проблема заключается в правилах GROK, я знаю это, потому что если я удаляю правила GROK, которые запускаются для app2, журналы отображаются, как и ожидалось. В тот момент, когда я раскомментирую правила grok, журналы для app2 перестают появляться в asticsearch где угодно

Фильтры для app1 и app2 идентичны:

filter {
    if "app2" in [tags] {
            mutate {
                    gsub => ["message", "\n", "LINE_BREAK"]
            }
            grok {
                    match => [ "message", "%{TIMESTAMP_ISO8601:time}\s+%{WORD:level}\s+\[%{DATA:thread_name}\]\s+%{DATA:class}\:%{DATA:line} %{DATA:method}\s*-\s*%{DATA:message}$" ]
                    overwrite => [ "message" ]
            }
            date {
                    match => [ "time", "YYYY-MM-dd HH:mm:ss,SSS"]
                    target => "@timestamp"
            }
            mutate {
                    remove_field => [ "time" ]  # Removes the 'time' field                        
            }
    } 
}

Я подозреваю, что asticsearch отказывается индексировать журналы из app2. Естественно, что я проверил журналы обоих элементов, но о проблемах не сообщалось. Это привело меня к исследованию того, как "включить" регистрацию в asticsearch.

Кто-нибудь знает, как заставить asticsearch сообщать о любых ошибках, связанных с проглатыванием этих журналов? или у меня есть представление о том, как я могу узнать, что происходит с журналами app2, когда грок включен?

Я попробовал это:

    # curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{ 
  "transient": {
"logger._root": "trace" 
 } 
}
'

что, как и следовало ожидать, дает мне "пожарный шланг ко рту", ​​но, по крайней мере, что-то, что можно разгадать. Тег упоминается только с точки зрения обработки конкретной строки журнала.

Заранее спасибо.

Немного подробнее об этом: я только что запустил logstash с установленными правилами grok app2 и с включенным ведением журнала фильтра следующим образом:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.filters.grok" : "ALL"
}'

Никаких ошибок не возникает, что еще раз подтверждает мою теорию о том, что сами правила Грока являются правильными и что его упругий поиск отказывается индексировать сообщения. Я также сделал это:

# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d' 
{
"logger.logstash.outputs.elasticsearch" : "ALL"
} '

Для проверки нет ошибок индексации. Хотя об ошибках не сообщается, несколько тревожно, но НИЧЕГО не сообщается, что заставляет меня задуматься, не лаю ли я не то дерево.

1 ответ

По моему опыту, когда ES надевает вкладыш, он вырвет его прямо в журналах, чтобы бедный человек смог его расшифровать и выяснить. Я обычно вижу это, когда есть проблема с отображением. Тип столкновения или искаженный документ.

(Это причина номер один, я не записываю в журнал свои журналы ES. Это плохое поглощение снова приведет к отказу при приеме пищи, когда оно будет в журналах ES, и во время выполнения цикла ошибок. Кроме того, в правильных случаях это PII-бомба)

Еще один шаг для устранения неполадок - установить условный выход рядом с выходом ES, чтобы сбросить app1 а также app2 события в файл. Это даст вам возможность взглянуть на них бок о бок в том состоянии, в котором они будут отправлены в ES. Это может показать некоторые подсказки относительно того, что происходит. Возможно, какой-то другой этап фильтрации манипулирует одним. Или, может быть app2 никогда не бывает так далеко, поэтому проблема между фильтром и output {} этапы.

Другие вопросы по тегам