Estou usando o logstash para coletar logs de um grupo de aplicativos da Web e enviá-los para o graylog2 para visualização centralizada.
Eu tenho o seguinte filtro para tokenizing:
grok {
type => "webapps"
pattern => "^%{TIME:timestamp} \[%{NOTSPACE:thread}\]%{SPACE}%{WORD:loglevel}%{SPACE}%{JAVACLASS:class} - %{GREEDYDATA:short_message}"
drop => false
debug => "true"
add_tag => [ "%{loglevel}" ]
}
O nível de log será ao longo das linhas de TRACE, DEBUG, INFO, AVISO, ERRO, FATAL.
Inicialmente, tudo estava aparecendo como "Alerta" (que tem um valor numérico de 5 em ruby / graylog-server e é marcado nas fontes como "desconhecido").
Em seguida, adicionei uma série de filtros mutate, como estes:
mutate {
type => "webapps"
tags => "INFO"
add_tag => [ "ll_%{@level}", "mutated" ]
replace => [ "@level", "6" ] # informational
}
Isso me aproximou do nível de log / gravidade adequado exibido na interface web, mas todas as mensagens "INFO" estavam aparecendo como mensagens de depuração.
Eu escrevi um script para examinar os dados do elasticsearch e definir o campo de nível com base no que deveria ser.
- Depurar: 7
- Informativo: 6
- Aviso: 4
- Erro: 3
- Crítico: 2
com os níveis 0, 1 e 5 não sendo usados, pois as fontes indicaram que estes eram reservados.
Mas esse script é caro em termos de recursos e não acho que funcionaria muito bem quando o conjunto de dados que está tentando atualizar está crescendo a uma taxa de centenas ou milhares de mensagens por segundo.
A outra coisa que notei é que quando eu uso algo como "@source" em uma tag, o valor apropriado aparece. Quando eu faço "@level", eu entendo isso como um literal, o que indica que não é um campo pré-definido que foi indicado.
Eu olhei as fontes um pouco, mas não exaustivamente, então é possível que eu tenha perdido isso.
A questão é, o que eu preciso mudar no meu filtro mutate para fazer "INFO" aparecer como "Informativo" na interface do graylog2?