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

Былые времена

Думаю объяснять зачем нужны логи не стоит, уверен что это должно быть очевидно каждом IT-шнику. Но если совсем кратко, то логи нужны чтобы система сообщала, что она делает и потом, читая логи, можно было разобраться в проблемах, возникших внутри системы, ну или не разобраться, и это повод улучшить логирование.

Так вот тогда система писала логи по аналогии с тем как это делается в любой *nix ОСи, т.е. записывала информацию в файл, формат записи плюс/минус был стандартный:

<date time> <level> <message>

Логи ядра linux
Логи ядра linux

Кратко о системе: это сервисы SOAP API, в логи записывались запросы, ответы и важная служебная информация.

Поиск и анализ логов был прост: открываешь файл и поиском по тексту ищешь по шаблону нужное место.

Думаю вы уже догадываетесь какие трудности возникали в результате этого. Основная трудность - это найти в логах информацию о возникшем сбое. По сути есть только время сбоя, причем приблизительное, например "около 12ч дня наблюдали проблемы у сервиса".

Открываешь файл, начинаешь искать по времени с 12:00 по 12:10, ничего не находишь и думаешь "а был ли сбой?".

Или наоборот, конкретный случай у клиента, он в браузере увидел ошибку, система состояла из ряда сервисов, которые взаимодействовали между собой, поэтому сбой мог быть в любом из них. И приходилось смотреть по всем файлам, искать ошибки по ключевому слову ERROR и приблизительному времени, указанному клиентом.

С ростом нагрузки на сервис, анализ логов становился просто невозможным, начинали писать скрипты, которые парсят файлы логов в поисках ошибок и проблем. Удорожание сопровождения становилось все большим, процент времени, уделяемый командой разработки на анализ логов, стремительно возрастал. Нужно было что-то менять.

Рождение PID

Идея с PID возникла всё из тех же предпосылок, связанных с *nix.

Техническая команда запрашивала по возможности предоставлять запрос к системе и её ответ. Это позволяло начать поиск в логах по дате и времени, что упрощало анализ. Однако система состояла из нескольких сервисов. Допустим, у нас есть запрос и ответ от одного сервиса — но как найти остальные логи? Это можно сделать по цепочке, но такой подход отнимал слишком много времени.

Так возникла идея связать логи единым сквозным идентификатором. Его назвали просто — PID.

Принцип работы такой:

  • Сервис при получении запроса проверял наличие PID.

  • Если идентификатора не было — генерировал его.

  • Далее передавал этот PID всем связанным сервисам в рамках процесса.

Важно: PID уникален только в контексте одного внешнего запроса/процесса.

В результате в логах появился дополнительный параметр, который объединял записи всех сервисов, участвующих в обработке запроса. Теперь, имея даже один запрос/ответ, мы могли использовать PID для быстрого поиска всех связанных логов — это занимало меньше времени, чем раньше.

Позже, вместо запроса полных данных стали запрашивать PID из ответа. Это дополнительно ускорило анал��з логов.

Ускорение

Тем не менее скорость анализа оставалась низкой, плюс стало очевидно, что команда разработки не может заниматься полным сопровождением/поддержкой системы. Нужен был отдел технической поддержки, где разбирали бы логи и вносили изменения в настройки системы. Многие ошибки были связанны не с багами системы, а с неверными настройками или отсутствием оных.

Логи в файлах становились препятствием, хоть работа с файлам кажется простой, но сопутствующие ограничения очень сильно мешали подключать ребят из тех. поддержки к анализу. Приведу ряд примеров:

  • доступы к файлам: т.е. как минимум какой-то ssh-доступ к серверу, где есть логи;

  • размеры файлов: требовалось отдельно научить и проинструктировать как правильно работать с по-настоящему гигантскими файлами, не правильно откроешь их и сервер накроется медным тазом;

  • медленный поиск: из-за того что файлов могло быть много от разных сервисов, то приходилось открывать каждый и просматривать. У команды разработки были скрипты, которые они использовали для поиска, но это почти уже кодинг, а отдел ИБ сильно против того, чтобы ребята из тех. поддержки выполняли какой-то скрипт на прод-серверах.

Знаю, знаю, что все выше перечисленные ограничения можно решить, организовав отдельное хранилище с отдельными доступами и т.д. Но это тоже будет часть системы, которую надо сопровождать, на которую тоже придется тратить дополнительные силы.

Поэтому мы решили переехать с файлов в MongoDB, т.е. записывать те��ерь логи в монгу.

Чем понравилась MongoDB:

  • гибкий формат записи, т.е. можно расширять запись в коллекции дополнительными полями;

  • довольно быстрая NoSQL БД;

  • возможность использования индексов, PID идеально подходил под индексирование;

  • возможность написания скриптов для поиска по записям.

Мы переделали механизм логирования, добавив в него возможность записывать логи в монгу. Теперь вместо файла у нас была коллекция.

Поиск по PID и по всем коллекция был в разы быстрее, вместо открытия десятков файлов, мы просто набирали запрос в монгу с указанием PID и получали все записи логов, сделанные в рамках одного процесса/одного PID'а.

Плюс ко всему получали возможность проводить анализ не по одному процессу, а по всем, указывая в скрипте шаблон поиска определенной ошибки или участка логов.

Из мелких последующих доработок следует отметить разбиение коллекций по времени, т.к. бесконечно записывать в одну коллекцию все логи сервиса было нереально. Мы добавили в название коллекции суффикс года и месяца collection_name_202505.

UI тулз

Через какое-то время от тех. поддержки стали приходить жалобы, что работать с монгой не удобно, особенно, если пользуешься консолью. "Знали бы они, как не удобно было раньше" - думали мы тогда.

Первым решением было использовать Robomongo и это помогло, простой и понятный gui-клиент.

Логи из Robomongo
Логи из Robomongo

Но со временем неудобства накапливались. Например, самая частая жалоба была на xml-разметку: чтобы отформатировать ее, приходилось копировать данные в сторонние форматеры, что было конечно же не удобно.

Поэтому было решено сделать свой web-интерфейс и уже его дорабатывать как хочется, и xml форматировать, и другие удобства прикручивать.

Проблема возникла откуда не ждали: отдел разработки был загружен бизнес-задачами и никак не мог начать делать UI tools.

Но как говорится "спасение утопающих - дело рук самих утопающих". Один из инженеров в тех. поддержке очень хотел стать программистом, а именно фронтенд-программистом. Решили ему дать задание сделать UI tools для чтения и анализа логов. Парень - молодец! Где-то через месяц сделал первый вариант веб-интерфейса, мы его называли "ч��до-юдо". Тем не менее в работе отдела саппорта тулза прижилась.

К нашему сожалению парень, сделавший "чудо-юдо" ушел в другую контору, становится настоящим программистом. Удачи тебе, герой!

А мы столкнулись с тех. долгом, но уже была основа, и отдел программистов понемногу улучшал "чудо-юдо", превратив его со временем в мощный инструмент для тех. поддержки, но это уже другая история.

Логи из Support Tools
Логи из Support Tools

Послесловие

Сегодня ребята из тех. поддержки, да и других отделов от разработки до админов/devops, не могут себе представить времена, когда не было UI тулзы для логов, не могут представить себе логи без PID.