vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php line 32

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\Handler\FingersCrossed\ErrorLevelActivationStrategy;
  12. use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
  13. use Monolog\Logger;
  14. use Monolog\ResettableInterface;
  15. use Monolog\Formatter\FormatterInterface;
  16. /**
  17.  * Buffers all records until a certain level is reached
  18.  *
  19.  * The advantage of this approach is that you don't get any clutter in your log files.
  20.  * Only requests which actually trigger an error (or whatever your actionLevel is) will be
  21.  * in the logs, but they will contain all records, not only those above the level threshold.
  22.  *
  23.  * You can find the various activation strategies in the
  24.  * Monolog\Handler\FingersCrossed\ namespace.
  25.  *
  26.  * @author Jordi Boggiano <j.boggiano@seld.be>
  27.  */
  28. class FingersCrossedHandler extends AbstractHandler
  29. {
  30.     protected $handler;
  31.     protected $activationStrategy;
  32.     protected $buffering true;
  33.     protected $bufferSize;
  34.     protected $buffer = array();
  35.     protected $stopBuffering;
  36.     protected $passthruLevel;
  37.     /**
  38.      * @param callable|HandlerInterface       $handler            Handler or factory callable($record|null, $fingersCrossedHandler).
  39.      * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
  40.      * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
  41.      * @param bool                            $bubble             Whether the messages that are handled can bubble up the stack or not
  42.      * @param bool                            $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
  43.      * @param int                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered
  44.      */
  45.     public function __construct($handler$activationStrategy null$bufferSize 0$bubble true$stopBuffering true$passthruLevel null)
  46.     {
  47.         if (null === $activationStrategy) {
  48.             $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
  49.         }
  50.         // convert simple int activationStrategy to an object
  51.         if (!$activationStrategy instanceof ActivationStrategyInterface) {
  52.             $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy);
  53.         }
  54.         $this->handler $handler;
  55.         $this->activationStrategy $activationStrategy;
  56.         $this->bufferSize $bufferSize;
  57.         $this->bubble $bubble;
  58.         $this->stopBuffering $stopBuffering;
  59.         if ($passthruLevel !== null) {
  60.             $this->passthruLevel Logger::toMonologLevel($passthruLevel);
  61.         }
  62.         if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) {
  63.             throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object");
  64.         }
  65.     }
  66.     /**
  67.      * {@inheritdoc}
  68.      */
  69.     public function isHandling(array $record)
  70.     {
  71.         return true;
  72.     }
  73.     /**
  74.      * Manually activate this logger regardless of the activation strategy
  75.      */
  76.     public function activate()
  77.     {
  78.         if ($this->stopBuffering) {
  79.             $this->buffering false;
  80.         }
  81.         $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);
  82.         $this->buffer = array();
  83.     }
  84.     /**
  85.      * {@inheritdoc}
  86.      */
  87.     public function handle(array $record)
  88.     {
  89.         if ($this->processors) {
  90.             foreach ($this->processors as $processor) {
  91.                 $record call_user_func($processor$record);
  92.             }
  93.         }
  94.         if ($this->buffering) {
  95.             $this->buffer[] = $record;
  96.             if ($this->bufferSize && count($this->buffer) > $this->bufferSize) {
  97.                 array_shift($this->buffer);
  98.             }
  99.             if ($this->activationStrategy->isHandlerActivated($record)) {
  100.                 $this->activate();
  101.             }
  102.         } else {
  103.             $this->getHandler($record)->handle($record);
  104.         }
  105.         return false === $this->bubble;
  106.     }
  107.     /**
  108.      * {@inheritdoc}
  109.      */
  110.     public function close()
  111.     {
  112.         $this->flushBuffer();
  113.     }
  114.     public function reset()
  115.     {
  116.         $this->flushBuffer();
  117.         parent::reset();
  118.         if ($this->getHandler() instanceof ResettableInterface) {
  119.             $this->getHandler()->reset();
  120.         }
  121.     }
  122.     /**
  123.      * Clears the buffer without flushing any messages down to the wrapped handler.
  124.      *
  125.      * It also resets the handler to its initial buffering state.
  126.      */
  127.     public function clear()
  128.     {
  129.         $this->buffer = array();
  130.         $this->reset();
  131.     }
  132.     /**
  133.      * Resets the state of the handler. Stops forwarding records to the wrapped handler.
  134.      */
  135.     private function flushBuffer()
  136.     {
  137.         if (null !== $this->passthruLevel) {
  138.             $level $this->passthruLevel;
  139.             $this->buffer array_filter($this->buffer, function ($record) use ($level) {
  140.                 return $record['level'] >= $level;
  141.             });
  142.             if (count($this->buffer) > 0) {
  143.                 $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer);
  144.             }
  145.         }
  146.         $this->buffer = array();
  147.         $this->buffering true;
  148.     }
  149.     /**
  150.      * Return the nested handler
  151.      *
  152.      * If the handler was provided as a factory callable, this will trigger the handler's instantiation.
  153.      *
  154.      * @return HandlerInterface
  155.      */
  156.     public function getHandler(array $record null)
  157.     {
  158.         if (!$this->handler instanceof HandlerInterface) {
  159.             $this->handler call_user_func($this->handler$record$this);
  160.             if (!$this->handler instanceof HandlerInterface) {
  161.                 throw new \RuntimeException("The factory callable should return a HandlerInterface");
  162.             }
  163.         }
  164.         return $this->handler;
  165.     }
  166.     /**
  167.      * {@inheritdoc}
  168.      */
  169.     public function setFormatter(FormatterInterface $formatter)
  170.     {
  171.         $this->getHandler()->setFormatter($formatter);
  172.         return $this;
  173.     }
  174.     /**
  175.      * {@inheritdoc}
  176.      */
  177.     public function getFormatter()
  178.     {
  179.         return $this->getHandler()->getFormatter();
  180.     }
  181. }