Два урока подряд мы разбирали строки nginx: grok угадывал, где кончается адрес и начинается время, date переводил время из строки. Это работает, но хрупко: поменяй формат лога, и шаблон сломается для всех строк сразу. Для nginx и чужих программ деваться некуда, их формат не выбирают. А вот логи своих сервисов «Гонца» можно с самого начала писать так, чтобы разбирать было нечего.
Анкета вместо письма
Сравни два способа получить данные о человеке. Первый: он пишет письмо в свободной форме, а ты вычитываешь из текста имя, возраст и город. Второй: он заполняет анкету с готовыми полями. Во втором случае ничего угадывать не надо, а ошибиться можно только в самом поле.
Строка 2026-06-30 19:40:11,395 ERROR [http-nio-8080-exec-12] r.g.payments.BankGatewayClient - Payment authorization failed for order 104565 это письмо. А вот анкета, та же запись в JSON:
{"@timestamp":"2026-06-30T19:40:11.395Z","log.level":"ERROR","service.name":"payments","message":"Bank gateway timeout","trace.id":"a55396a66aada17e","order.id":104565,"duration_ms":30004,"error.type":"BankTimeoutException"}
Это структурированное логирование: каждая запись это объект JSON в одну строку. Такой формат называют NDJSON или JSON Lines.
Что это даёт
- Разбирать нечего. Поля уже есть. Не нужен grok, не нужно угадывать границы.
- Формат не ломается. Новое поле в записи просто появится в индексе, старые шаблоны от этого не перестанут работать.
- Типы честные.
duration_msзаписан числом,order.idчислом, и в Elasticsearch по ним сразу можно считать. - Контекст в каждой строке. Номер заказа, сервис, trace.id запроса. По
trace.idпотом находят все записи всех сервисов, через которые прошёл один заказ. Это мы будем делать в уроке про разбор инцидента.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.