diff vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children 129ea1e6d783
line wrap: on
line diff
--- a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php	Mon Apr 23 09:33:26 2018 +0100
+++ b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php	Mon Apr 23 09:46:53 2018 +0100
@@ -24,12 +24,19 @@
 class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
 {
     private $logger;
+    private $containerPathPrefix;
 
-    public function __construct($logger = null)
+    public function __construct($logger = null, $containerPathPrefix = null)
     {
         if (null !== $logger && $logger instanceof DebugLoggerInterface) {
+            if (!method_exists($logger, 'clear')) {
+                @trigger_error(sprintf('Implementing "%s" without the "clear()" method is deprecated since Symfony 3.4 and will be unsupported in 4.0 for class "%s".', DebugLoggerInterface::class, \get_class($logger)), E_USER_DEPRECATED);
+            }
+
             $this->logger = $logger;
         }
+
+        $this->containerPathPrefix = $containerPathPrefix;
     }
 
     /**
@@ -43,11 +50,25 @@
     /**
      * {@inheritdoc}
      */
+    public function reset()
+    {
+        if ($this->logger && method_exists($this->logger, 'clear')) {
+            $this->logger->clear();
+        }
+        $this->data = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
     public function lateCollect()
     {
         if (null !== $this->logger) {
-            $this->data = $this->computeErrorsCount();
-            $this->data['logs'] = $this->sanitizeLogs($this->logger->getLogs());
+            $containerDeprecationLogs = $this->getContainerDeprecationLogs();
+            $this->data = $this->computeErrorsCount($containerDeprecationLogs);
+            $this->data['compiler_logs'] = $this->getContainerCompilerLogs();
+            $this->data['logs'] = $this->sanitizeLogs(array_merge($this->logger->getLogs(), $containerDeprecationLogs));
+            $this->data = $this->cloneVar($this->data);
         }
     }
 
@@ -86,6 +107,11 @@
         return isset($this->data['scream_count']) ? $this->data['scream_count'] : 0;
     }
 
+    public function getCompilerLogs()
+    {
+        return isset($this->data['compiler_logs']) ? $this->data['compiler_logs'] : array();
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -94,29 +120,87 @@
         return 'logger';
     }
 
+    private function getContainerDeprecationLogs()
+    {
+        if (null === $this->containerPathPrefix || !file_exists($file = $this->containerPathPrefix.'Deprecations.log')) {
+            return array();
+        }
+
+        $bootTime = filemtime($file);
+        $logs = array();
+        foreach (unserialize(file_get_contents($file)) as $log) {
+            $log['context'] = array('exception' => new SilencedErrorContext($log['type'], $log['file'], $log['line'], $log['trace'], $log['count']));
+            $log['timestamp'] = $bootTime;
+            $log['priority'] = 100;
+            $log['priorityName'] = 'DEBUG';
+            $log['channel'] = '-';
+            $log['scream'] = false;
+            unset($log['type'], $log['file'], $log['line'], $log['trace'], $log['trace'], $log['count']);
+            $logs[] = $log;
+        }
+
+        return $logs;
+    }
+
+    private function getContainerCompilerLogs()
+    {
+        if (null === $this->containerPathPrefix || !file_exists($file = $this->containerPathPrefix.'Compiler.log')) {
+            return array();
+        }
+
+        $logs = array();
+        foreach (file($file, FILE_IGNORE_NEW_LINES) as $log) {
+            $log = explode(': ', $log, 2);
+            if (!isset($log[1]) || !preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $log[0])) {
+                $log = array('Unknown Compiler Pass', implode(': ', $log));
+            }
+
+            $logs[$log[0]][] = array('message' => $log[1]);
+        }
+
+        return $logs;
+    }
+
     private function sanitizeLogs($logs)
     {
         $sanitizedLogs = array();
+        $silencedLogs = array();
 
         foreach ($logs as $log) {
             if (!$this->isSilencedOrDeprecationErrorLog($log)) {
-                $log['context'] = $log['context'] ? $this->cloneVar($log['context']) : $log['context'];
                 $sanitizedLogs[] = $log;
 
                 continue;
             }
 
+            $message = $log['message'];
             $exception = $log['context']['exception'];
-            $errorId = md5("{$exception->getSeverity()}/{$exception->getLine()}/{$exception->getFile()}".($exception instanceof \Exception ? "\0".$exception->getMessage() : ''), true);
+
+            if ($exception instanceof SilencedErrorContext) {
+                if (isset($silencedLogs[$h = spl_object_hash($exception)])) {
+                    continue;
+                }
+                $silencedLogs[$h] = true;
+
+                if (!isset($sanitizedLogs[$message])) {
+                    $sanitizedLogs[$message] = $log + array(
+                        'errorCount' => 0,
+                        'scream' => true,
+                    );
+                }
+                $sanitizedLogs[$message]['errorCount'] += $exception->count;
+
+                continue;
+            }
+
+            $errorId = md5("{$exception->getSeverity()}/{$exception->getLine()}/{$exception->getFile()}\0{$message}", true);
 
             if (isset($sanitizedLogs[$errorId])) {
                 ++$sanitizedLogs[$errorId]['errorCount'];
             } else {
-                $log['context'] = $log['context'] ? $this->cloneVar($log['context']) : $log['context'];
-
                 $log += array(
                     'errorCount' => 1,
-                    'scream' => $exception instanceof SilencedErrorContext,
+                    'scream' => false,
                 );
 
                 $sanitizedLogs[$errorId] = $log;
@@ -145,8 +229,9 @@
         return false;
     }
 
-    private function computeErrorsCount()
+    private function computeErrorsCount(array $containerDeprecationLogs)
     {
+        $silencedLogs = array();
         $count = array(
             'error_count' => $this->logger->countErrors(),
             'deprecation_count' => 0,
@@ -169,14 +254,23 @@
             }
 
             if ($this->isSilencedOrDeprecationErrorLog($log)) {
-                if ($log['context']['exception'] instanceof SilencedErrorContext) {
-                    ++$count['scream_count'];
+                $exception = $log['context']['exception'];
+                if ($exception instanceof SilencedErrorContext) {
+                    if (isset($silencedLogs[$h = spl_object_hash($exception)])) {
+                        continue;
+                    }
+                    $silencedLogs[$h] = true;
+                    $count['scream_count'] += $exception->count;
                 } else {
                     ++$count['deprecation_count'];
                 }
             }
         }
 
+        foreach ($containerDeprecationLogs as $deprecationLog) {
+            $count['deprecation_count'] += $deprecationLog['context']['exception']->count;
+        }
+
         ksort($count['priorities']);
 
         return $count;