108 lines
3.2 KiB
PHP
108 lines
3.2 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the Monolog package.
|
||
|
*
|
||
|
* (c) Jordi Boggiano <j.boggiano@seld.be>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Monolog\Formatter;
|
||
|
|
||
|
use Monolog\Utils;
|
||
|
|
||
|
/**
|
||
|
* Formats a record for use with the MongoDBHandler.
|
||
|
*
|
||
|
* @author Florian Plattner <me@florianplattner.de>
|
||
|
*/
|
||
|
class MongoDBFormatter implements FormatterInterface
|
||
|
{
|
||
|
private $exceptionTraceAsString;
|
||
|
private $maxNestingLevel;
|
||
|
|
||
|
/**
|
||
|
* @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2
|
||
|
* @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings
|
||
|
*/
|
||
|
public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = true)
|
||
|
{
|
||
|
$this->maxNestingLevel = max($maxNestingLevel, 0);
|
||
|
$this->exceptionTraceAsString = (bool) $exceptionTraceAsString;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*/
|
||
|
public function format(array $record)
|
||
|
{
|
||
|
return $this->formatArray($record);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* {@inheritDoc}
|
||
|
*/
|
||
|
public function formatBatch(array $records)
|
||
|
{
|
||
|
foreach ($records as $key => $record) {
|
||
|
$records[$key] = $this->format($record);
|
||
|
}
|
||
|
|
||
|
return $records;
|
||
|
}
|
||
|
|
||
|
protected function formatArray(array $record, $nestingLevel = 0)
|
||
|
{
|
||
|
if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) {
|
||
|
foreach ($record as $name => $value) {
|
||
|
if ($value instanceof \DateTime) {
|
||
|
$record[$name] = $this->formatDate($value, $nestingLevel + 1);
|
||
|
} elseif ($value instanceof \Exception) {
|
||
|
$record[$name] = $this->formatException($value, $nestingLevel + 1);
|
||
|
} elseif (is_array($value)) {
|
||
|
$record[$name] = $this->formatArray($value, $nestingLevel + 1);
|
||
|
} elseif (is_object($value)) {
|
||
|
$record[$name] = $this->formatObject($value, $nestingLevel + 1);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$record = '[...]';
|
||
|
}
|
||
|
|
||
|
return $record;
|
||
|
}
|
||
|
|
||
|
protected function formatObject($value, $nestingLevel)
|
||
|
{
|
||
|
$objectVars = get_object_vars($value);
|
||
|
$objectVars['class'] = Utils::getClass($value);
|
||
|
|
||
|
return $this->formatArray($objectVars, $nestingLevel);
|
||
|
}
|
||
|
|
||
|
protected function formatException(\Exception $exception, $nestingLevel)
|
||
|
{
|
||
|
$formattedException = array(
|
||
|
'class' => Utils::getClass($exception),
|
||
|
'message' => $exception->getMessage(),
|
||
|
'code' => $exception->getCode(),
|
||
|
'file' => $exception->getFile() . ':' . $exception->getLine(),
|
||
|
);
|
||
|
|
||
|
if ($this->exceptionTraceAsString === true) {
|
||
|
$formattedException['trace'] = $exception->getTraceAsString();
|
||
|
} else {
|
||
|
$formattedException['trace'] = $exception->getTrace();
|
||
|
}
|
||
|
|
||
|
return $this->formatArray($formattedException, $nestingLevel);
|
||
|
}
|
||
|
|
||
|
protected function formatDate(\DateTime $value, $nestingLevel)
|
||
|
{
|
||
|
return new \MongoDate($value->getTimestamp());
|
||
|
}
|
||
|
}
|