ELK Журналы из приложения исчезают при включении правил grok
У нас есть два экземпляра приложения (одно и то же приложение, другая база данных), давайте назовем их app1 и app2. Маршрут, по которому идут журналы:
- appX запускает filebeat, который берет файл журнала приложений с тегами appX и отправляет каждую запись в экземпляр logstash в кластере rabbitmq. Затем его добавляют в rabbitmq.
- Сообщение проходит через кластер rabbitmq и используется другим экземпляром logstash, который запускает различные фильтры в зависимости от тега.
- Тот же экземпляр 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 {}
этапы.