Назад | Перейти на главную страницу

Анализ файлов журнала log4j с помощью logstash

Я разбираю многострочные журналы log4j с помощью logstash, и у меня возникла самая любопытная проблема.

Вот пример некоторых связанных записей журнала:

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

Вот моя конфигурация logstash для 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"
    }
}

Результат в порядке; нет ошибок синтаксического анализа Grok, даты в порядке, уровень журнала в порядке, НО, содержимое сообщения дублируется:

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

И в первой строке дублированного контента отсутствуют отметка времени и уровень журнала!

Кто-нибудь знает, почему это происходит?

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ после замечаний 473183469

Шаблон даты в многострочном фильтре не работает должным образом.

Я изменил конфигурацию logstash, чтобы объединить строки, поступающие только из исключений (точно так же, как un the документы)

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"
    }
}

Я просто добавил еще один многострочный фильтр на случай, если в трассировке стека присутствует строка «Причина».

Это работает нормально, за исключением того, что содержимое сообщения дублируется таким же образом! Опять же отсутствует отметка времени и уровень журнала:

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

Я действительно не могу понять, что происходит.

Вам действительно нужен multiline?

Не multiline используется для повторного объединения одного журнала, который был разделен rsyslog?

Типичным примером является сообщение трассировки ошибки стека Java.

Если rsyslog разделится на «\ n» ошибку трассировки стека, мы больше ничего не поймем, поэтому нам нужно переупорядочить сообщение.

Ваш пример отличается, потому что каждая строка журнала выглядит независимо от других строк журнала.

Вкратце: дублирование, а также подавление заголовка исходят от multiline. Либо исправить multiline в соответствии с вашим вариантом использования или (как я подозреваю) удалите его tout-court.