vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php line 76

Open in your IDE?
  1. <?php declare(strict_types=1);
  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 Rollbar\RollbarLogger;
  12. use Throwable;
  13. use Monolog\Logger;
  14. /**
  15.  * Sends errors to Rollbar
  16.  *
  17.  * If the context data contains a `payload` key, that is used as an array
  18.  * of payload options to RollbarLogger's log method.
  19.  *
  20.  * Rollbar's context info will contain the context + extra keys from the log record
  21.  * merged, and then on top of that a few keys:
  22.  *
  23.  *  - level (rollbar level name)
  24.  *  - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8)
  25.  *  - channel
  26.  *  - datetime (unix timestamp)
  27.  *
  28.  * @author Paul Statezny <paulstatezny@gmail.com>
  29.  */
  30. class RollbarHandler extends AbstractProcessingHandler
  31. {
  32.     /**
  33.      * @var RollbarLogger
  34.      */
  35.     protected $rollbarLogger;
  36.     /** @var string[] */
  37.     protected $levelMap = [
  38.         Logger::DEBUG     => 'debug',
  39.         Logger::INFO      => 'info',
  40.         Logger::NOTICE    => 'info',
  41.         Logger::WARNING   => 'warning',
  42.         Logger::ERROR     => 'error',
  43.         Logger::CRITICAL  => 'critical',
  44.         Logger::ALERT     => 'critical',
  45.         Logger::EMERGENCY => 'critical',
  46.     ];
  47.     /**
  48.      * Records whether any log records have been added since the last flush of the rollbar notifier
  49.      *
  50.      * @var bool
  51.      */
  52.     private $hasRecords false;
  53.     /** @var bool */
  54.     protected $initialized false;
  55.     /**
  56.      * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token
  57.      */
  58.     public function __construct(RollbarLogger $rollbarLogger$level Logger::ERRORbool $bubble true)
  59.     {
  60.         $this->rollbarLogger $rollbarLogger;
  61.         parent::__construct($level$bubble);
  62.     }
  63.     /**
  64.      * {@inheritDoc}
  65.      */
  66.     protected function write(array $record): void
  67.     {
  68.         if (!$this->initialized) {
  69.             // __destructor() doesn't get called on Fatal errors
  70.             register_shutdown_function(array($this'close'));
  71.             $this->initialized true;
  72.         }
  73.         $context $record['context'];
  74.         $context array_merge($context$record['extra'], [
  75.             'level' => $this->levelMap[$record['level']],
  76.             'monolog_level' => $record['level_name'],
  77.             'channel' => $record['channel'],
  78.             'datetime' => $record['datetime']->format('U'),
  79.         ]);
  80.         if (isset($context['exception']) && $context['exception'] instanceof Throwable) {
  81.             $exception $context['exception'];
  82.             unset($context['exception']);
  83.             $toLog $exception;
  84.         } else {
  85.             $toLog $record['message'];
  86.         }
  87.         // @phpstan-ignore-next-line
  88.         $this->rollbarLogger->log($context['level'], $toLog$context);
  89.         $this->hasRecords true;
  90.     }
  91.     public function flush(): void
  92.     {
  93.         if ($this->hasRecords) {
  94.             $this->rollbarLogger->flush();
  95.             $this->hasRecords false;
  96.         }
  97.     }
  98.     /**
  99.      * {@inheritDoc}
  100.      */
  101.     public function close(): void
  102.     {
  103.         $this->flush();
  104.     }
  105.     /**
  106.      * {@inheritDoc}
  107.      */
  108.     public function reset()
  109.     {
  110.         $this->flush();
  111.         parent::reset();
  112.     }
  113. }