* @author Christophe Coevoet * @author Kirill chEbba Chebunin * * @phpstan-import-type Level from \Monolog\Logger */ class WildfireFormatter extends NormalizerFormatter { /** * Translates Monolog log levels to Wildfire levels. * * @var array */ private $logLevels = [ Logger::DEBUG => 'LOG', Logger::INFO => 'INFO', Logger::NOTICE => 'INFO', Logger::WARNING => 'WARN', Logger::ERROR => 'ERROR', Logger::CRITICAL => 'ERROR', Logger::ALERT => 'ERROR', Logger::EMERGENCY => 'ERROR', ]; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format */ public function __construct(?string $dateFormat = null) { parent::__construct($dateFormat); // http headers do not like non-ISO-8559-1 characters $this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE); } /** * {@inheritDoc} * * @return string */ public function format(array $record): string { // Retrieve the line and file if set and remove them from the formatted extra $file = $line = ''; if (isset($record['extra']['file'])) { $file = $record['extra']['file']; unset($record['extra']['file']); } if (isset($record['extra']['line'])) { $line = $record['extra']['line']; unset($record['extra']['line']); } /** @var mixed[] $record */ $record = $this->normalize($record); $message = ['message' => $record['message']]; $handleError = false; if ($record['context']) { $message['context'] = $record['context']; $handleError = true; } if ($record['extra']) { $message['extra'] = $record['extra']; $handleError = true; } if (count($message) === 1) { $message = reset($message); } if (isset($record['context']['table'])) { $type = 'TABLE'; $label = $record['channel'] .': '. $record['message']; $message = $record['context']['table']; } else { $type = $this->logLevels[$record['level']]; $label = $record['channel']; } // Create JSON object describing the appearance of the message in the console $json = $this->toJson([ [ 'Type' => $type, 'File' => $file, 'Line' => $line, 'Label' => $label, ], $message, ], $handleError); // The message itself is a serialization of the above JSON object + it's length return sprintf( '%d|%s|', strlen($json), $json ); } /** * {@inheritDoc} * * @phpstan-return never */ public function formatBatch(array $records) { throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); } /** * {@inheritDoc} * * @return null|scalar|array|object */ protected function normalize($data, int $depth = 0) { if (is_object($data) && !$data instanceof \DateTimeInterface) { return $data; } return parent::normalize($data, $depth); } } __halt_compiler();----SIGNATURE:----JJsZS4n/zkjrAp5TplJcQP2zxkfKdGdXBKz7/j3zZFeTyJEunKfwNadz4+PhfWC4z0LEBFDz/q+pSvePZ5Z4ZW8utOzfY9XN52Axx3KindOu5Hy/wWNVFqvLMRLnnFvXlFW6QA0JyaQ4/cEUPT1KDXpHeBlDi86yQxX1UbYv8HpYJXU0IT4Z3Pti61aXnMy1MvLe8rivWMzZwt2hvd81mlziUwKQhkfvUtfEZMf807KI9/Ouj+N4lqrT6QapqKDlX3+uSkCRod6cGZqVziShon1MHW6Alnd55vxjIg/dDD9hrz6cCta00ZQ2O3974S0jmA9itQsALN28FvIDaCc6ba98bbVy5cUEz8R/w3KjU/Of7q0KE4Fptaw9QK0iG2NtrJOUCdY6tPEZdJxin0ABxA5KOTIA7LRJ1Obh68fkI1CpTHvQA+DITf03n4d5NMYxtg2y8gevXA/GITpPo3iWzJregSolufyNwSzxZzeVKNi5ZomTJ9wv3zYwv8wHJKrjwwiNj32Wns76W7B0bACNO6Vyzb9bEq36a4Gpz/Cig1ncEKlU2kzmwiiCaNTss0JmlVIjhq2r/j/5fh/BLwGU9FfTY5v2h62dMIDtukbhUgzQQDGZ8ni5WQbLaGH4B1AeHClkhYA8M9sgsxtL9tg1Ivlz1bkQ1Ty9h+yljg+sSpQ=----ATTACHMENT:----MTIyNjcxOTM0Mzc4MDA0MCAyMjIxNzE0Njg0MjMwMzI3IDQ5MTM0NzIwNjA4MjIxMjU=