49 lines
1.6 KiB
PHP
49 lines
1.6 KiB
PHP
<?php
|
|
namespace Incoviba\Common\Implement\Log\Formatter;
|
|
|
|
use Throwable;
|
|
use Monolog\Formatter\JsonFormatter;
|
|
use Monolog\LogRecord;
|
|
|
|
class PDO extends JsonFormatter
|
|
{
|
|
public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = true)
|
|
{
|
|
parent::__construct($batchMode, $appendNewline, $ignoreEmptyContextAndExtra, $includeStacktraces);
|
|
}
|
|
|
|
public function format(LogRecord $record): string
|
|
{
|
|
if (is_a($record->message, Throwable::class)) {
|
|
$exception = $record->message;
|
|
$message = $this->normalizeException($exception);
|
|
$context = $record->context;
|
|
$context['exception'] = $exception;
|
|
if ($exception->getPrevious()) {
|
|
$context['previous'] = $this->walkException($exception);
|
|
}
|
|
$new_record = new LogRecord(
|
|
$record->datetime,
|
|
$record->channel,
|
|
$record->level,
|
|
json_encode($message),
|
|
$context,
|
|
$record->extra
|
|
);
|
|
$record = $new_record;
|
|
}
|
|
$normalized = $this->normalize($record, $this->maxNormalizeDepth);
|
|
return $normalized['message'];
|
|
}
|
|
|
|
protected function walkException(Throwable $exception, int $depth = 0): array
|
|
{
|
|
$output = [];
|
|
$currentDepth = $depth;
|
|
while ($previous = $exception->getPrevious() and $currentDepth < $this->maxNormalizeDepth) {
|
|
$output []= $this->normalizeException($previous);
|
|
}
|
|
return $output;
|
|
}
|
|
}
|