10, Logger::ERROR => 5]); * * $log->pushHandler($overflow); * ``` * * @author Kris Buist */ class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface { /** @var HandlerInterface */ private $handler; /** @var int[] */ private $thresholdMap = [ Logger::DEBUG => 0, Logger::INFO => 0, Logger::NOTICE => 0, Logger::WARNING => 0, Logger::ERROR => 0, Logger::CRITICAL => 0, Logger::ALERT => 0, Logger::EMERGENCY => 0, ]; /** * Buffer of all messages passed to the handler before the threshold was reached * * @var mixed[][] */ private $buffer = []; /** * @param HandlerInterface $handler * @param int[] $thresholdMap Dictionary of logger level => threshold */ public function __construct( HandlerInterface $handler, array $thresholdMap = [], $level = Logger::DEBUG, bool $bubble = true, ) { $this->handler = $handler; foreach ($thresholdMap as $thresholdLevel => $threshold) { $this->thresholdMap[$thresholdLevel] = $threshold; } parent::__construct($level, $bubble); } /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * {@inheritDoc} */ public function handle(array $record): bool { if ($record['level'] < $this->level) { return false; } $level = $record['level']; if (!isset($this->thresholdMap[$level])) { $this->thresholdMap[$level] = 0; } if ($this->thresholdMap[$level] > 0) { // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1 $this->thresholdMap[$level]--; $this->buffer[$level][] = $record; return false === $this->bubble; } if ($this->thresholdMap[$level] == 0) { // This current message is breaking the threshold. Flush the buffer and continue handling the current record foreach ($this->buffer[$level] ?? [] as $buffered) { $this->handler->handle($buffered); } $this->thresholdMap[$level]--; unset($this->buffer[$level]); } $this->handler->handle($record); return false === $this->bubble; } /** * {@inheritDoc} */ public function setFormatter(FormatterInterface $formatter): HandlerInterface { if ($this->handler instanceof FormattableHandlerInterface) { $this->handler->setFormatter($formatter); return $this; } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } /** * {@inheritDoc} */ public function getFormatter(): FormatterInterface { if ($this->handler instanceof FormattableHandlerInterface) { return $this->handler->getFormatter(); } throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); } } __halt_compiler();----SIGNATURE:----e5mOHk1blDHF64PORLqQMMD+BJ0ad7pTKS4LlUscrr8rF9c3h2LgLm5l29Sht/5DsQGkSt5Y2te+xpclBZgMHRbs1zkMuvuSAV4hpcB0OA1au53yTcdzHuh1mgH2U1XCt2UxYZ4XDrK2WXCrQLmN5DonlbfJzCIeV2i/o5ja6pGDeYBetMt7teVK/q3iPGW8fMq2DCLnDAsN00s4qTSJamWjGdWzZFUFbrobJWX5VrKTSLYnJqHDSGlPUWYwxtWg+a+MI8Z9DHeIgML+Y7H30B9N9mP4EOx6yWsAZPe2TYFjLdDJ7DisXLnMfpoH7FbwdhqEH0SY5+FY/Vd6MRNdnN38DBKwedYdSv9ys/FGM+WtEvHn6Sabx9Te7DOvGcta7M6C74dyWqwS/RN23+QhYGu6F1wSxkKbqAOAV7fSbnCS8fB00DUwEyXeiop4wNYVM6kkLXfbIt5gA43Ew0/A9Qx+ME7QoE77RZGw0JuoX036eYpjwk2zX6dF6MMNFJ2tNVaNjSgUUBvtyivyDCgg5mmy99kfSgM23N5aaCaMiW62oQ3jioS636gnpe8aL6Dm7AMCFOVlBRrRi31KRM/Jba1axvVEiadKOAbwFa0Oj4a0uAztjUcsscfZ1ey0NH2i7slDZIPhC1sLJCSmWEE9CWr8rjoRMH31WCfulVWAkPc=----ATTACHMENT:----NjMzMjE1OTc5MjIzMDU2NiAzMTE4MzE3MzAxODAyOTI3IDkxMTg5MjYxNzc3OTExNw==