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

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

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

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

Было предложение перенести логи в RabbitMQ с дальнейшей обработкой сторонним подписчиком. В таком случае не возникнет ли дополнительная чрезмерная нагрузка на сервер?
  • Вопрос задан
  • 233 просмотра
Пригласить эксперта
Ответы на вопрос 1
neuotq
@neuotq
Прокрастинация
Сложно сказать без более подробной логики и кода. Скорее всего у вас ошибка где-то. Запись в Monolog ведётся в режиме добавление в конец fopen + a, что подразумевает (в POSIX совместимой ОС):
O_APPEND и O_CREAT
O_APPEND Перед каждой записью помещает указатель файла в конец
файла. Иными словами, все операции записи будут
происходить в конец файла.
O_CREAT Создает файл, если он не существует.

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

Войдите, чтобы написать ответ

Похожие вопросы