Здравствуйте.
Изучаю ELK-стек. Разбирать однострочные логи получается, проблема со склейкой многострочного лога.
Вот пример куска
[2019-03-26T09:30:00,877][INFO][36:44040130377103334][PlatformInfoBean][Send 'getAccountInfo' response: GetAccountInfoResponse:[userName]=User;[banTime]=null;]
[2019-03-26T09:30:00,879][DEBUG][36:44040130519649266][SoapHandler][
Outbound message:
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<S:Body>
<GetAccountInfoResponse xmlns="http://platforminfo.processing.ru/">
<UserName>User</UserName>
</GetAccountInfoResponse>
</S:Body>
</S:Envelope>
]
[2019-03-26T09:30:06,441][DEBUG][12960:44040136082174637][SoapHandler][
Inbound message:
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<S:Body>
<ns0:GetAccountInfoRequest xmlns:ns0="http://platforminfo.processing.ru/">
<ns0:localSystemId>11550000</ns0:localSystemId>
<ns0:appPkId>01</ns0:appPkId>
<ns0:profileId>2180000</ns0:profileId>
</ns0:GetAccountInfoRequest>
</S:Body>
</S:Envelope>
]
[2019-03-26T09:30:06,442][INFO][12960:44040136083827797][PlatformInfoBean][Receive 'getAccountInfo' request: GetAccountInfoRequest:[localSystemId]=11550000;[appPkId]=01;[profileId]=2180000;]
[2019-03-26T09:30:06,442][INFO][12960:4404013608380000][PublicBeanLocal_3nga0w_Impl][Start operation 'accountInfo', params:Request:[userId]=2180000;[region]=RU;]
[2019-03-26T09:30:06,442][INFO][12960:4404013608380000][PublicExecuter][Подготовлен запрос: ?account_id=2180000&language=ru&application_id=9cf167606e5ed897fcbb34fba6d00bc0]
На клиенте в Filebeat (секция filebeat.inputs) добавляю шаблон для склеивания
multiline.pattern: '\[$'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: '^\]$'
И все бы ничего, Inbound message склеивается теперь в один message. НО все, что не подходит под шаблон тоже склеивается. Т.е. последние сообщения из приведенного лога
[2019-03-26T09:30:06,442], [2019-03-26T09:30:06,442], [2019-03-26T09:30:06,442] идут в одном message. Но правильнее их разделять по отдельности.
При этом смотрю оф.документацию https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html (раздел multiline.match
). Если я правильно понимаю примеры, то это нормальная работа при настройке multiline. Возможно ли сохранить склейку и разделение построчного вывода логов в отдельных message ?
Скрины прикладываю.
Когда я пытался склеивать большие логи, столкнулся с теми же проблемами. Я не знаю, как это красиво обходить. Получается очень негибкая и громоздкая система. Нужно разделять потоки логов.
Самое простое и очевидное решение - если есть возможность, изменить формат вывода логов, например, в json и отправлять в elk стэк в json формате. Возможно, есть более удобные способы формирования логов для elk, чтобы склеивать их в другом месте, а потом уже передавать в elk.
Вопрос решен.
Надо было подходить к решению с другой стороны.
Изменил паттерн
multiline.pattern: '^\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}'
multiline.negate: true
multiline.match: after
т.е. начал разбор по началу строки (по дате). Поскольку в каждой строке (даже в многострочном логе) в начале стоит дата, то и склейка происходит по первому полю.
Официальная документация слишком "узкая" для такой большой и сложной системы...
Спасибо за решение.
Да, документация достаточно полная, но очень общая. С частными случаями приходится очень долго разбираться. Я так возился с правилами на ruby в logstash. Возможность заявлена и описана в документации, но как на практике писать рабочие правила не очень было понятно.