Просмотр исходного кода

Set default date format to have a timezone, fixes #196

Jordi Boggiano 9 лет назад
Родитель
Сommit
76a91c6722

+ 1 - 1
phpunit.xml.dist

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<phpunit bootstrap="vendor/autoload.php" colors="true">
+<phpunit bootstrap="tests/bootstrap.php" colors="true">
     <testsuites>
         <testsuite name="Monolog Test Suite">
             <directory>tests/Monolog/</directory>

+ 6 - 4
src/Monolog/DateTimeImmutable.php

@@ -34,10 +34,7 @@ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
         $this->useMicroseconds = $useMicroseconds;
     }
 
-    /**
-     * @return string
-     */
-    public function jsonSerialize()
+    public function jsonSerialize(): string
     {
         if ($this->useMicroseconds) {
             return $this->format('Y-m-d\TH:i:s.uP');
@@ -45,4 +42,9 @@ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
 
         return $this->format('Y-m-d\TH:i:sP');
     }
+
+    public function __toString(): string
+    {
+        return $this->jsonSerialize();
+    }
 }

+ 7 - 3
src/Monolog/Formatter/NormalizerFormatter.php

@@ -12,6 +12,7 @@
 namespace Monolog\Formatter;
 
 use Throwable;
+use Monolog\DateTimeImmutable;
 
 /**
  * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
@@ -20,7 +21,7 @@ use Throwable;
  */
 class NormalizerFormatter implements FormatterInterface
 {
-    const SIMPLE_DATE = "Y-m-d H:i:s";
+    const SIMPLE_DATE = "Y-m-d\TH:i:sP";
 
     protected $dateFormat;
 
@@ -29,7 +30,7 @@ class NormalizerFormatter implements FormatterInterface
      */
     public function __construct($dateFormat = null)
     {
-        $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE;
+        $this->dateFormat = $dateFormat;
         if (!function_exists('json_encode')) {
             throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter');
         }
@@ -86,7 +87,10 @@ class NormalizerFormatter implements FormatterInterface
         }
 
         if ($data instanceof \DateTimeInterface) {
-            return $data->format($this->dateFormat);
+            if ($data instanceof DateTimeImmutable) {
+                return (string) $data;
+            }
+            return $data->format($this->dateFormat ?: static::SIMPLE_DATE);
         }
 
         if (is_object($data)) {

+ 4 - 2
tests/Monolog/Formatter/ScalarFormatterTest.php

@@ -11,6 +11,8 @@
 
 namespace Monolog\Formatter;
 
+use Monolog\DateTimeImmutable;
+
 class ScalarFormatterTest extends \PHPUnit_Framework_TestCase
 {
     private $formatter;
@@ -49,7 +51,7 @@ class ScalarFormatterTest extends \PHPUnit_Framework_TestCase
             'baz' => false,
             'bam' => array(1, 2, 3),
             'bat' => array('foo' => 'bar'),
-            'bap' => \DateTimeImmutable::createFromFormat(\DateTime::ISO8601, '1970-01-01T00:00:00+0000'),
+            'bap' => $dt = new DateTimeImmutable(true),
             'ban' => $exception,
         ));
 
@@ -59,7 +61,7 @@ class ScalarFormatterTest extends \PHPUnit_Framework_TestCase
             'baz' => false,
             'bam' => $this->encodeJson(array(1, 2, 3)),
             'bat' => $this->encodeJson(array('foo' => 'bar')),
-            'bap' => '1970-01-01 00:00:00',
+            'bap' => (string) $dt,
             'ban' => $this->encodeJson(array(
                 'class'   => get_class($exception),
                 'message' => $exception->getMessage(),

+ 1 - 1
tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php

@@ -38,7 +38,7 @@ class DoctrineCouchDBHandlerTest extends TestCase
             'level' => Logger::WARNING,
             'level_name' => 'WARNING',
             'channel' => 'test',
-            'datetime' => $record['datetime']->format('Y-m-d H:i:s'),
+            'datetime' => (string) $record['datetime'],
             'extra' => array(),
         );
 

+ 2 - 2
tests/Monolog/Handler/LogEntriesHandlerTest.php

@@ -37,7 +37,7 @@ class LogEntriesHandlerTest extends TestCase
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
 
-        $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content);
+        $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}\+00:00\] test.CRITICAL: Critical write test/', $content);
     }
 
     public function testWriteBatchContent()
@@ -53,7 +53,7 @@ class LogEntriesHandlerTest extends TestCase
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
 
-        $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content);
+        $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}\+00:00\] .* \[\] \[\]\n){3}/', $content);
     }
 
     private function createHandler()

+ 1 - 1
tests/Monolog/Handler/MailHandlerTest.php

@@ -64,7 +64,7 @@ class MailHandlerTest extends TestCase
 
         $record = $this->getRecord();
         $records = array($record);
-        $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n";
+        $records[0]['formatted'] = '['.$record['datetime'].'] test.WARNING: test [] []'."\n";
 
         $handler->expects($this->once())
             ->method('send')

+ 5 - 0
tests/bootstrap.php

@@ -0,0 +1,5 @@
+<?php
+
+date_default_timezone_set('UTC');
+
+require __DIR__.'/../vendor/autoload.php';