Estou analisando logs log4j de múltiplas linhas com o logstash e tenho o problema mais curioso.
Veja um exemplo de algumas entradas de registro relacionadas:
2016-01-05 13:55:26,275 DEBUG [class] [thread] - bla
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaaa
2016-01-05 13:55:27,030 DEBUG [class] [thread] - blaaaaaaa
Aqui está minha configuração de logstash para log4j:
if [type] == "log4j" {
multiline {
pattern => "(^%d{yyyy-MM-dd HH:mm:ss,SSS})"
what => previous
negate => true
}
grok {
match => ["message", "%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel} (?.*)"]
}
date {
match => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]
timezone => "Europe/Paris"
}
}
O resultado é bom; não há erros de análise de grok, as datas são boas, o nível de log é bom, MAS, o conteúdo da mensagem é duplicado:
2016-01-05 13:55:26,275 DEBUG [class] [thread] - bla
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaaa
2016-01-05 13:55:27,030 DEBUG [class] [thread] - blaaaaaaa
[class] [thread] - bla
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaa
2016-01-05 13:55:26,275 DEBUG [class] [thread] - blaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaa
2016-01-05 13:55:26,282 DEBUG [class] [thread] - blaaaaaa
2016-01-05 13:55:27,030 DEBUG [class] [thread] - blaaaaaaa
E o timestamp e o nível de log estão faltando na primeira linha do conteúdo duplicado!
Alguém sabe por que isso está acontecendo?
Qualquer ajuda é bem-vinda.
EDITAR após as observações do 473183469
O padrão de data no filtro de múltiplas linhas não funciona como esperado.
Eu modifiquei a configuração do logstash para combinar linhas que vêm apenas de exceções (assim como o docs )
if [type] == "log4j" {
multiline {
pattern => "^\s"
what => "previous"
}
multiline {
pattern => "^Caused"
what => "previous"
}
grok {
match => ["message", "%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel} (?.*)"]
}
date {
match => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]
timezone => "Europe/Paris"
}
}
Eu juste adicionei outro filtro de múltiplas linhas caso uma linha "Causada por" esteja presente no rastreamento de pilha.
Isso funciona bem, exceto que o conteúdo da mensagem é duplicado da mesma maneira! Novamente, o registro de data e hora e o nível de log estão ausentes:
016-01-06 09:46:00,842 ERROR [coyntry.org.web.LoaderListener] [Thread-6] - java.lang.RuntimeException: java.io.FileNotFoundException: file (No such file or directory)
at coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
at coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
at coyntry.org.web.LoaderListener$LoaderThread.run(LoaderListener.java:74)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: file (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:146)
at coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
[coyntry.org.web.LoaderListener] [Thread-6] - java.lang.RuntimeException: java.io.FileNotFoundException: file (No such file or directory)
... 3 more,
at coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
at coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
at coyntry.org.web.LoaderListener$LoaderThread.run(LoaderListener.java:74)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: file (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:146)
at coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
... 3 more
Eu realmente não consigo entender o que está acontecendo.