*/ 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:----bXwA0hxblDj5kxiQBLin2zaZTsTMgsxbq34lpZh2MPHfvL6PaDDBCF666ag1vlkIl9FTx/T9fLaFsgGfPuWTnb4XG2Tb8ttZzUxNFmG/X9KAT7adogd2e3Vg1hqTw/366me7xpX6UNpwUHOADoSlLX/pXPQS4SGQTF5OSjOE3Hiw9S3w1oEp/dzF1K0lkeS9BFOw5r3Jol3tcjBcHogbfFVLbQxTqgYhWiUxADob1aRM+Y4bkm0Rx3SfASAqrlw/aWIddQGukXWdesx9oItyNcTfjy75Tl9WE/NeeSdflN1DwSTy3GBcRWUrgUIO019iy1cpHGopxgkeEVom2l3wJ8AxYMmRLvhFOGaDyOPO/gbnBW7Y1tKFKkXJFXheX9BBB3mGDRI6i13Qrj4sowN0izwL4Kfyctw2H1i+UsU9V57nbiEYkf30RlFqW7QOMjm1O2yctR/BTeWKjnGcenXlqOf2+rkHCzwbj+cfIcmzVfJ9X+sees/jKHiqwLSyzlvR1NYH2iRpBFb2kPd84BbgM3uY+zb9oTyFwuxtC76ct7CrmsBjWlrpbkFe+NN5DRKs7e/Nt9lvXOvHP1iDryCzEu89s95CPci2p+eQbqwLBnkHjj0zsDi97YAcHZzf2XagH6dHlb75mYfmDh7xYXN50OB/bwQ1O+tGOaXCqXT25Lg=----ATTACHMENT:----Mjg3NTM5MTg2ODIzMTEyMyA0NzEwNzMxMDQwMjk4NDAxIDQwMjM4NjYyMTA3NjI1MzU=