소스 검색

Fix microseconds support on 7.1, and enable it by default as 7.1 has no perf cost anymore

Jordi Boggiano 9 년 전
부모
커밋
4a43d9b17c
4개의 변경된 파일16개의 추가작업 그리고 8개의 파일을 삭제
  1. 3 1
      src/Monolog/DateTimeImmutable.php
  2. 6 2
      src/Monolog/Logger.php
  3. 2 2
      tests/Monolog/Handler/RavenHandlerTest.php
  4. 5 3
      tests/Monolog/LoggerTest.php

+ 3 - 1
src/Monolog/DateTimeImmutable.php

@@ -23,10 +23,12 @@ class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable
 
 
     public function __construct($useMicroseconds, \DateTimeZone $timezone = null)
     public function __construct($useMicroseconds, \DateTimeZone $timezone = null)
     {
     {
+        static $needsMicrosecondsHack = PHP_VERSION_ID < 70100;
+
         $this->useMicroseconds = $useMicroseconds;
         $this->useMicroseconds = $useMicroseconds;
         $date = 'now';
         $date = 'now';
 
 
-        if ($useMicroseconds) {
+        if ($needsMicrosecondsHack && $useMicroseconds) {
             $timestamp = microtime(true);
             $timestamp = microtime(true);
 
 
             // apply offset of the timezone as microtime() is always UTC
             // apply offset of the timezone as microtime() is always UTC

+ 6 - 2
src/Monolog/Logger.php

@@ -128,7 +128,7 @@ class Logger implements LoggerInterface
     /**
     /**
      * @var bool
      * @var bool
      */
      */
-    protected $microsecondTimestamps = false;
+    protected $microsecondTimestamps = true;
 
 
     /**
     /**
      * @var DateTimeZone
      * @var DateTimeZone
@@ -251,13 +251,17 @@ class Logger implements LoggerInterface
      * Control the use of microsecond resolution timestamps in the 'datetime'
      * Control the use of microsecond resolution timestamps in the 'datetime'
      * member of new records.
      * member of new records.
      *
      *
-     * Generating microsecond resolution timestamps by calling
+     * On PHP7.0, generating microsecond resolution timestamps by calling
      * microtime(true), formatting the result via sprintf() and then parsing
      * microtime(true), formatting the result via sprintf() and then parsing
      * the resulting string via \DateTime::createFromFormat() can incur
      * the resulting string via \DateTime::createFromFormat() can incur
      * a measurable runtime overhead vs simple usage of DateTime to capture
      * a measurable runtime overhead vs simple usage of DateTime to capture
      * a second resolution timestamp in systems which generate a large number
      * a second resolution timestamp in systems which generate a large number
      * of log events.
      * of log events.
      *
      *
+     * On PHP7.1 however microseconds are always included by the engine, so
+     * this setting can be left alone unless you really want to suppress
+     * microseconds in the output.
+     *
      * @param bool $micro True to use microtime() to create timestamps
      * @param bool $micro True to use microtime() to create timestamps
      */
      */
     public function useMicrosecondTimestamps(bool $micro)
     public function useMicrosecondTimestamps(bool $micro)

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

@@ -215,10 +215,10 @@ class RavenHandlerTest extends TestCase
             $this->getRecord(Logger::INFO, 'information 2'),
             $this->getRecord(Logger::INFO, 'information 2'),
         );
         );
 
 
-        $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
+        $logFormatter = $this->createMock('Monolog\\Formatter\\FormatterInterface');
         $logFormatter->expects($this->once())->method('formatBatch');
         $logFormatter->expects($this->once())->method('formatBatch');
 
 
-        $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface');
+        $formatter = $this->createMock('Monolog\\Formatter\\FormatterInterface');
         $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) {
         $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) {
             return $record['message'] == 'error 1';
             return $record['message'] == 'error 1';
         }));
         }));

+ 5 - 3
tests/Monolog/LoggerTest.php

@@ -551,7 +551,7 @@ class LoggerTest extends \PHPUnit_Framework_TestCase
      * @covers Monolog\Logger::useMicrosecondTimestamps
      * @covers Monolog\Logger::useMicrosecondTimestamps
      * @covers Monolog\Logger::addRecord
      * @covers Monolog\Logger::addRecord
      */
      */
-    public function testUseMicrosecondTimestamps($micro, $assert)
+    public function testUseMicrosecondTimestamps($micro, $assert, $assertFormat)
     {
     {
         $logger = new Logger('foo');
         $logger = new Logger('foo');
         $logger->useMicrosecondTimestamps($micro);
         $logger->useMicrosecondTimestamps($micro);
@@ -560,14 +560,16 @@ class LoggerTest extends \PHPUnit_Framework_TestCase
         $logger->info('test');
         $logger->info('test');
         list($record) = $handler->getRecords();
         list($record) = $handler->getRecords();
         $this->{$assert}('000000', $record['datetime']->format('u'));
         $this->{$assert}('000000', $record['datetime']->format('u'));
+        $this->assertSame($record['datetime']->format($assertFormat), (string) $record['datetime']);
     }
     }
 
 
     public function useMicrosecondTimestampsProvider()
     public function useMicrosecondTimestampsProvider()
     {
     {
         return [
         return [
             // this has a very small chance of a false negative (1/10^6)
             // this has a very small chance of a false negative (1/10^6)
-            'with microseconds' => [true, 'assertNotSame'],
-            'without microseconds' => [false, 'assertSame'],
+            'with microseconds' => [true, 'assertNotSame', 'Y-m-d\TH:i:s.uP'],
+            // php 7.1 always includes microseconds, so we keep them in, but we format the datetime without
+            'without microseconds' => [false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame', 'Y-m-d\TH:i:sP'],
         ];
         ];
     }
     }
 }
 }