*/ class RollbarHandler extends AbstractProcessingHandler { /** @var RollbarLogger */ protected $rollbarLogger; /** @var string[] */ protected $levelMap = [ Logger::DEBUG => 'debug', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warning', Logger::ERROR => 'error', Logger::CRITICAL => 'critical', Logger::ALERT => 'critical', Logger::EMERGENCY => 'critical', ]; /** * Records whether any log records have been added since the last flush of the rollbar notifier * * @var bool */ private $hasRecords = false; /** @var bool */ protected $initialized = false; /** * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token */ public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true) { $this->rollbarLogger = $rollbarLogger; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record): void { if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors register_shutdown_function(array($this, 'close')); $this->initialized = true; } $context = $record['context']; $context = array_merge($context, $record['extra'], [ 'level' => $this->levelMap[$record['level']], 'monolog_level' => $record['level_name'], 'channel' => $record['channel'], 'datetime' => $record['datetime']->format('U'), ]); if (isset($context['exception']) && $context['exception'] instanceof Throwable) { $exception = $context['exception']; unset($context['exception']); $toLog = $exception; } else { $toLog = $record['message']; } // @phpstan-ignore-next-line $this->rollbarLogger->log($context['level'], $toLog, $context); $this->hasRecords = true; } public function flush(): void { if ($this->hasRecords) { $this->rollbarLogger->flush(); $this->hasRecords = false; } } /** * {@inheritDoc} */ public function close(): void { $this->flush(); } /** * {@inheritDoc} */ public function reset() { $this->flush(); parent::reset(); } } __halt_compiler();----SIGNATURE:----dKhnwh02UZQepPaLZsjDq+UNo+gjS3lIon0ScoKEZ/kX2zflSpHRTrDZnXjWqVTchonbYm1roFS3g5+XE/JhLzmf+B1ea0tBHOuoqmvXwYOSZu+zSMw+m4Y4S5uaZ3mmW5ga5CJPweRb3f7j2lRvNQhPAIJl2yd2CrJNlSSQnkSPBOPN9yEs3cKzfD8bDjrEtg4qLV9b4iMSSqTcgsODxR6pVT29b9p/VaF2ItO1jVjRia5rWmHFNAZaA2NId8gyGOkFtkkAJr22ztfjZkXpiwZi7r/U6I0gE0vrxnDbc90Sc+D7TdGAymCan5qysqS20rzPpIqKOqgi8wFNXXxpw1L2XyXRAvJdzurlO09xKyUjJJUZBrbWITdKZo+vb0pc7HVrsy8Yh0xy/lWXmaY/QdfMrY4KB+qaXL5yPVAmvGJxYqEf0GmPN8UgiSFAdtFQYJkzyzZQwS1kGfHkHyhWpc74aq0sHcpnkNmsHJApCUjLjHKYpDoquSJhgcMAZfhY3EeNF/d3Cz664ktiAt+/Jvf4xV+XZCfGpvIC5RdGTUh8ZG5xQE+5ftHSdFZv8SXm3Qp+hgck59dKnhjdwQToSVwDOKdEGIFMLFBmSo6FIBibHbdiARyqa/cEhVlkL6qvTfP0v5vi1+AIUEWQtYLOh25kYj3cb1MxfiN5EV/dNG8=----ATTACHMENT:----MjY4MDU2NzgzMzMwNzAxNCA4MzI0MzYwMzA1ODgxODUxIDE1OTE3NzQ4MDQ3NTgyMzk=