MonologBu​​ndle内存泄漏(?)

时间:2015-04-02 14:12:21

标签: symfony memory-leaks rabbitmq monolog

我在Symfony2(兔子消费者)中有一个长时间运行的过程,我正在使用 MonologBu​​ndle 进行日志记录。这些行会立即记录,但我注意到每次迭代时进程的内存消耗都在增加,在fiew分钟后达到1GB以上。

该脚本以: - 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);
        }

这是~10k迭代后的var_dump内容:

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:我用简单的monolog重复测试,没有内存问题。

2 个答案:

答案 0 :(得分:3)

fingers_crossed预期的行为。它将日志条目存储在内存中,直到发生action_level事件。将其更改为stream或其他一些非缓冲处理程序。

答案 1 :(得分:2)

您还可以使用" buffer_size"来限制存储的日志数量。参见:

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