67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?php
|
|
namespace Incoviba\Common\Implement\Log\Processor;
|
|
|
|
use Throwable;
|
|
use Monolog\LogRecord;
|
|
use Monolog\Processor\ProcessorInterface;
|
|
|
|
class Exception implements ProcessorInterface
|
|
{
|
|
public function __invoke(LogRecord $record): LogRecord
|
|
{
|
|
$context = $record->context;
|
|
foreach ($context as $key => $value) {
|
|
if (is_a($value, Throwable::class)) {
|
|
$exception = $value;
|
|
$output = $this->processException($exception);
|
|
$context[$key] = $output;
|
|
$new_record = new LogRecord(
|
|
$record->datetime,
|
|
$record->channel,
|
|
$record->level,
|
|
$record->message,
|
|
$context,
|
|
$record->extra
|
|
);
|
|
$record = $new_record;
|
|
}
|
|
}
|
|
if (is_a($record->message, Throwable::class)) {
|
|
$exception = $record->message;
|
|
$output = $this->processException($exception);
|
|
$message = $output['message'];
|
|
if (array_key_exists('exception', $context)) {
|
|
$context['other_exception'] = $context['exception'];
|
|
}
|
|
$context['exception'] = $output;
|
|
$new_record = new LogRecord(
|
|
$record->datetime,
|
|
$record->channel,
|
|
$record->level,
|
|
$message,
|
|
$context,
|
|
$record->extra
|
|
);
|
|
$record = $new_record;
|
|
}
|
|
|
|
return $record;
|
|
}
|
|
|
|
protected function processException(Throwable $exception): array
|
|
{
|
|
$output = [
|
|
'class' => get_class($exception),
|
|
'code' => $exception->getCode(),
|
|
'message' => $exception->getMessage(),
|
|
'file' => $exception->getFile(),
|
|
'line' => $exception->getLine(),
|
|
'trace' => $exception->getTraceAsString(),
|
|
];
|
|
if ($exception->getPrevious() !== null) {
|
|
$output['previous'] = $this->processException($exception);
|
|
}
|
|
return $output;
|
|
}
|
|
}
|