Как решить утечку логов при их записи?



@Horder

Существует проект на Symfony 3.4. В качестве логгера используется Monolog (StreamHandler) и дополнительно интегрирован Stackify.

Есть алгоритм, на каждом шаге (допустим, их всего 4) которого обязательно создаются логи (либо успех, либо ошибка). Проблема в том, что после прохождения алгоритма возможны несколько исходов:
1. Есть все 4 записи в логах (нормальное состояние);
2. Есть только первая часть логов (например, 1 и 2 записи);
3. Есть только последняя запись (4). Интересно то, что они никак не могут быть записаны, без прохождения предыдущих шагов.
4. Логов вообще нет.

Возможно ли, что при нагрузке сервера файл логов взаимно блокируется потоками и в результате ни одной записи не будет записано, в дальнейшем поток отвалиться по таймауту?

Было предложение перенести логи в RabbitMQ с дальнейшей обработкой сторонним подписчиком. В таком случае не возникнет ли дополнительная чрезмерная нагрузка на сервер?


Решения вопроса 0


Ответы на вопрос 1



@neuotq

Сложно сказать без более подробной логики и кода. Скорее всего у вас ошибка где-то. Запись в Monolog ведётся в режиме добавление в конец fopen + a, что подразумевает (в POSIX совместимой ОС):

O_APPEND и O_CREAT

O_APPEND Перед каждой записью помещает указатель файла в конец
файла. Иными словами, все операции записи будут
происходить в конец файла.
O_CREAT Создает файл, если он не существует.

Поэтому в целом проблем быть в Линуксе не должно(грубо говоря), тк fwrite (при fopen + a) будет работать в атомарном режиме (и блокировать файл нет необходимости), только порядок строк не гарантируется.
А насчёт RabbitMQ не совсем понял. Ну ок, куда-то вы передали сообщение, но потом же его снова таки нужно записывать?
Насчёт нагрузки, здесь это вторично, нужно исходить из логики работы приложения, ну и RabbitMQ таки быстро работает, бутылочным горлышком в сравнении с записью в файл не будет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *