1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-05 12:47:39 +02:00

Add our own DateTime implementation to provide nicer JSON output, fixes #736

This commit is contained in:
Jordi Boggiano
2016-05-20 21:22:48 +01:00
parent e27225dc40
commit 912d813c73
4 changed files with 65 additions and 8 deletions

View File

@@ -0,0 +1,48 @@
<?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;
/**
* Overrides default json encoding of date time objects
*
* @author Menno Holtkamp
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
{
private $useMicroseconds;
public function __construct($useMicroseconds, \DateTimeZone $timezone = null)
{
$date = null;
if ($useMicroseconds) {
$timestamp = microtime(true);
$microseconds = sprintf("%06d", ($timestamp - floor($timestamp)) * 1000000);
$date = date('Y-m-d H:i:s.' . $microseconds, $timestamp);
}
parent::__construct($date, $timezone);
$this->useMicroseconds = $useMicroseconds;
}
/**
* @return string
*/
public function jsonSerialize()
{
if ($this->useMicroseconds) {
return $this->format('Y-m-d\TH:i:s.uP');
}
return $this->format('Y-m-d\TH:i:sP');
}
}

View File

@@ -315,12 +315,7 @@ class Logger implements LoggerInterface
return false;
}
if ($this->microsecondTimestamps) {
$ts = \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', microtime(true)), $this->timezone);
} else {
$ts = new \DateTimeImmutable('', $this->timezone);
}
$ts->setTimezone($this->timezone);
$ts = $this->createDateTime();
$record = array(
'message' => $message,
@@ -560,4 +555,17 @@ class Logger implements LoggerInterface
{
return $this->timezone;
}
/**
* Circumvent DateTimeImmutable::createFromFormat() which always returns the native DateTime instead of the specialized one
*
* @link https://bugs.php.net/bug.php?id=60302
*/
private function createDateTime(): DateTimeImmutable
{
$dateTime = new DateTimeImmutable($this->microsecondTimestamps, $this->timezone);
$dateTime->setTimezone($this->timezone);
return $dateTime;
}
}

View File

@@ -12,6 +12,7 @@
namespace Monolog\Test;
use Monolog\Logger;
use Monolog\DateTimeImmutable;
/**
* Lets you easily generate log records and a dummy formatter for testing purposes
@@ -31,7 +32,7 @@ class TestCase extends \PHPUnit_Framework_TestCase
'level' => $level,
'level_name' => Logger::getLevelName($level),
'channel' => 'test',
'datetime' => \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', microtime(true))),
'datetime' => new DateTimeImmutable(true),
'extra' => array(),
);
}

View File

@@ -42,7 +42,7 @@ class JsonFormatterTest extends TestCase
$formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false);
$record = $this->getRecord();
$this->assertEquals(json_encode($record), $formatter->format($record));
$this->assertEquals('{"message":"test","context":[],"level":300,"level_name":"WARNING","channel":"test","datetime":"'.$record['datetime']->format('Y-m-d\TH:i:s.uP').'","extra":[]}', $formatter->format($record));
}
/**