Temos duas instâncias de um aplicativo (mesmo aplicativo, banco de dados diferente), vamos chamá-lo de app1 e app2. A rota que os registros levam é:
- o appX executa o filebeat, que seleciona o arquivo de log do aplicativo com o appX e envia cada entrada para uma instância do logstash em um cluster rabbitmq. É então adicionado em coqm.
- A mensagem atravessa o cluster rabbitmq e é consumida por
outra instância do logstash, que executa vários filtros dependendo
a tag.
- A mesma instância do logstash envia a linha de log resultante para o elasticsearch.
Tudo bem. No caso de app1 & 2, os filtros são um grok, que divide a mensagem em campos em que podemos pesquisar.
app1 funciona, os logs são processados pelo filtro e aparecem no índice correto em elasticsearch como esperado.
app2 não funciona. O problema são as regras de grok, eu sei disso porque se eu remover as regras de grok que são executadas para app2, os logs aparecem conforme o esperado. No momento em que descomentei as regras de grok, os logs para app2 pararam de aparecer em elasticsearch em qualquer lugar
O filtro para app1 e app2 é idêntico:
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
}
}
}
Eu suspeito que o elasticsearch está se recusando a indexar os logs do app2. Naturalmente, verifiquei os registros de elasticsearch e logstash, mas nenhum problema foi relatado. Isso me levou a investigar como "transformar" o registro em elasticsearch.
Alguém sabe como fazer com que o elasticsearch relate qualquer erro relacionado à ingestão desses registros? ou ter uma idéia de como eu posso descobrir o que está acontecendo com os logs do app2 quando o grok está habilitado?
Eu tentei isso:
# curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"transient": {
"logger._root": "trace"
}
}
'
que previsivelmente me dá uma "mangueira de fogo para a boca", mas pelo menos algo que é greppable. A tag é mencionada apenas em termos de processamento de uma linha de registro específica.
Obrigado antecipadamente.
Um pouco mais sobre isso: Acabei de executar o logstash com as regras do app2 grok no lugar e com o log de filtro ativado da seguinte forma:
# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.filters.grok" : "ALL"
}'
Nenhum erro aparece, o que reforça a minha teoria de que as regras de grok estão corretas e que o elasticsearch está se recusando a indexar as mensagens. Eu também fiz isso:
# curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.outputs.elasticsearch" : "ALL"
} '
Para verificar se não há erros de indexação. Enquanto nenhum erro é relatado, um pouco preocupante, NADA é relatado, o que me faz pensar se estou latindo na árvore errada.