Log exception processor
This commit is contained in:
66
app/common/Implement/Log/Processor/Exception.php
Normal file
66
app/common/Implement/Log/Processor/Exception.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
}
|
@ -25,6 +25,7 @@ return [
|
|||||||
$container->get(Monolog\Processor\MemoryPeakUsageProcessor::class),
|
$container->get(Monolog\Processor\MemoryPeakUsageProcessor::class),
|
||||||
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
|
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
|
||||||
$container->get(Monolog\Processor\UidProcessor::class),
|
$container->get(Monolog\Processor\UidProcessor::class),
|
||||||
|
$container->get(Incoviba\Common\Implement\Log\Processor\Exception::class),
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
'baseDefaultHandlers' => function(ContainerInterface $container) {
|
'baseDefaultHandlers' => function(ContainerInterface $container) {
|
||||||
|
Reference in New Issue
Block a user