vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php line 26

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Monolog package.
  4.  *
  5.  * (c) Jordi Boggiano <j.boggiano@seld.be>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Monolog\Handler;
  11. use Monolog\Logger;
  12. use Monolog\ResettableInterface;
  13. use Monolog\Formatter\FormatterInterface;
  14. /**
  15.  * Buffers all records until closing the handler and then pass them as batch.
  16.  *
  17.  * This is useful for a MailHandler to send only one mail per request instead of
  18.  * sending one per log message.
  19.  *
  20.  * @author Christophe Coevoet <stof@notk.org>
  21.  */
  22. class BufferHandler extends AbstractHandler
  23. {
  24.     protected $handler;
  25.     protected $bufferSize 0;
  26.     protected $bufferLimit;
  27.     protected $flushOnOverflow;
  28.     protected $buffer = array();
  29.     protected $initialized false;
  30.     /**
  31.      * @param HandlerInterface $handler         Handler.
  32.      * @param int              $bufferLimit     How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
  33.      * @param int              $level           The minimum logging level at which this handler will be triggered
  34.      * @param bool             $bubble          Whether the messages that are handled can bubble up the stack or not
  35.      * @param bool             $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
  36.      */
  37.     public function __construct(HandlerInterface $handler$bufferLimit 0$level Logger::DEBUG$bubble true$flushOnOverflow false)
  38.     {
  39.         parent::__construct($level$bubble);
  40.         $this->handler $handler;
  41.         $this->bufferLimit = (int) $bufferLimit;
  42.         $this->flushOnOverflow $flushOnOverflow;
  43.     }
  44.     /**
  45.      * {@inheritdoc}
  46.      */
  47.     public function handle(array $record)
  48.     {
  49.         if ($record['level'] < $this->level) {
  50.             return false;
  51.         }
  52.         if (!$this->initialized) {
  53.             // __destructor() doesn't get called on Fatal errors
  54.             register_shutdown_function(array($this'close'));
  55.             $this->initialized true;
  56.         }
  57.         if ($this->bufferLimit && $this->bufferSize === $this->bufferLimit) {
  58.             if ($this->flushOnOverflow) {
  59.                 $this->flush();
  60.             } else {
  61.                 array_shift($this->buffer);
  62.                 $this->bufferSize--;
  63.             }
  64.         }
  65.         if ($this->processors) {
  66.             foreach ($this->processors as $processor) {
  67.                 $record call_user_func($processor$record);
  68.             }
  69.         }
  70.         $this->buffer[] = $record;
  71.         $this->bufferSize++;
  72.         return false === $this->bubble;
  73.     }
  74.     public function flush()
  75.     {
  76.         if ($this->bufferSize === 0) {
  77.             return;
  78.         }
  79.         $this->handler->handleBatch($this->buffer);
  80.         $this->clear();
  81.     }
  82.     public function __destruct()
  83.     {
  84.         // suppress the parent behavior since we already have register_shutdown_function()
  85.         // to call close(), and the reference contained there will prevent this from being
  86.         // GC'd until the end of the request
  87.     }
  88.     /**
  89.      * {@inheritdoc}
  90.      */
  91.     public function close()
  92.     {
  93.         $this->flush();
  94.     }
  95.     /**
  96.      * Clears the buffer without flushing any messages down to the wrapped handler.
  97.      */
  98.     public function clear()
  99.     {
  100.         $this->bufferSize 0;
  101.         $this->buffer = array();
  102.     }
  103.     public function reset()
  104.     {
  105.         $this->flush();
  106.         parent::reset();
  107.         if ($this->handler instanceof ResettableInterface) {
  108.             $this->handler->reset();
  109.         }
  110.     }
  111.     /**
  112.      * {@inheritdoc}
  113.      */
  114.     public function setFormatter(FormatterInterface $formatter)
  115.     {
  116.         $this->handler->setFormatter($formatter);
  117.         return $this;
  118.     }
  119.     /**
  120.      * {@inheritdoc}
  121.      */
  122.     public function getFormatter()
  123.     {
  124.         return $this->handler->getFormatter();
  125.     }
  126. }