Я разбираю многострочные журналы 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.