diff --git a/app/common/Implement/Log/Processor/Exception.php b/app/common/Implement/Log/Processor/Exception.php new file mode 100644 index 0000000..65211b1 --- /dev/null +++ b/app/common/Implement/Log/Processor/Exception.php @@ -0,0 +1,66 @@ +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; + } +} diff --git a/app/setup/setups/logs.php b/app/setup/setups/logs.php index c96cd40..46e5a7e 100644 --- a/app/setup/setups/logs.php +++ b/app/setup/setups/logs.php @@ -25,6 +25,7 @@ return [ $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), $container->get(Monolog\Processor\PsrLogMessageProcessor::class), $container->get(Monolog\Processor\UidProcessor::class), + $container->get(Incoviba\Common\Implement\Log\Processor\Exception::class), ]; }, 'baseDefaultHandlers' => function(ContainerInterface $container) {