Утечка памяти в MonologBundle (?)

У меня есть длительный процесс в Symfony2 (потребитель кроликов), и я использую MonologBundle для ведения журнала. Строки регистрируются немедленно, но я заметил, что потребление памяти процессом увеличивается с каждой итерацией, достигая более 1 ГБ через несколько минут.

Скрипт запускается с: --env=prod

Поэтому я сделал меньший тест:

        // taken from my symfony test command
        $logger = $this->getContainer()->get('logger');

        while (true){
            $logger->debug("line one");
            $logger->debug("line two");
            $logger->debug("line three");
            var_dump($logger);
        }

Это содержимое var_dump после примерно 10 000 итераций:

class Symfony\Bridge\Monolog\Logger#3 (3) {
  protected $name =>
  string(3) "app"
  protected $handlers =>
  array(1) {
    [0] =>
    class Monolog\Handler\FingersCrossedHandler#132 (11) {
      protected $handler =>
      class Monolog\Handler\StreamHandler#133 (9) {
        ...
      }
      protected $activationStrategy =>
      class Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy#134 (1) {
        ...
      }
      protected $buffering =>
      bool(true)
      protected $bufferSize =>
      int(0)
      protected $buffer =>
      array(100) {
        ...
      }
      protected $stopBuffering =>
      bool(true)
      protected $passthruLevel =>
      NULL
      protected $level =>
      int(100)
      protected $bubble =>
      bool(true)
      protected $formatter =>
      NULL
      protected $processors =>
      array(0) {
        ...
      }
    }
  }
  protected $processors =>
  array(0) {
  }
}

Настройки пакета Monolog:

monolog:
    handlers:
        main:
            type:         fingers_crossed
            action_level: error
            handler:      nested
            buffer_size:  100
        nested:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
            buffer_size:  100


framework:
    profiler:
        only_exceptions: false
        enabled: false
        collect: false 

Записи журнала в буфере не превышают buffer_limit, но использование памяти сценарием по-прежнему увеличивается.

Есть идеи? Спасибо

PS: Я повторил тест с простым монологом, и проблем с памятью не было.


person Tibor    schedule 02.04.2015    source источник
comment
У меня вопрос по поводу buffer_size, что означает это число? это означает размер буферизованного журнала или количество строк? Спасибо   -  person user2810081    schedule 26.08.2016
comment
Я думаю да, комментарий в коде говорит How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.   -  person max4ever    schedule 07.07.2021


Ответы (2)


Это fingers_crossed ожидаемое поведение. Он хранит записи журнала в памяти до тех пор, пока не произойдет событие action_level. Измените его на stream или другой небуферизирующий обработчик.

person Im0rtality    schedule 02.04.2015

Вы также можете ограничить количество журналов, хранимых с помощью «buffer_size». Видеть:

http://symfony.com/doc/current/reference/configuration/monolog.html

person bmlkc    schedule 15.05.2017