Analisando arquivos de log log4j com o logstash

2

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.

    
por kal3v 05.01.2016 / 14:33

1 resposta

1

Você realmente precisa do multiline ?

O multiline não é usado para unir novamente um único log que foi dividido pelo rsyslog?

O exemplo típico é a mensagem de rastreamento de erro da pilha java.

Se o rsyslog dividir no "\ n" erro de rastreamento da pilha, não vamos entender mais nada, então precisamos reorganizar a mensagem.

Seu exemplo é diferente, porque cada linha de log parece independente de outras linhas de registro.

Resumindo: a duplicação, bem como a supressão de cabeçalho, vêm de multiline . Corrigir multiline de acordo com o seu caso de uso ou (como eu suspeito) remover o tout-court.

    
por 05.01.2016 / 16:20