Patched to Drupal 8.4.8 level. See https://www.drupal.org/sa-core-2018-004 and patch...
[yaffs-website] / vendor / symfony / http-kernel / DataCollector / LoggerDataCollector.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\HttpKernel\DataCollector;
13
14 use Symfony\Component\Debug\Exception\SilencedErrorContext;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
18
19 /**
20  * LogDataCollector.
21  *
22  * @author Fabien Potencier <fabien@symfony.com>
23  */
24 class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
25 {
26     private $logger;
27
28     public function __construct($logger = null)
29     {
30         if (null !== $logger && $logger instanceof DebugLoggerInterface) {
31             $this->logger = $logger;
32         }
33     }
34
35     /**
36      * {@inheritdoc}
37      */
38     public function collect(Request $request, Response $response, \Exception $exception = null)
39     {
40         // everything is done as late as possible
41     }
42
43     /**
44      * {@inheritdoc}
45      */
46     public function lateCollect()
47     {
48         if (null !== $this->logger) {
49             $this->data = $this->computeErrorsCount();
50             $this->data['logs'] = $this->sanitizeLogs($this->logger->getLogs());
51         }
52     }
53
54     /**
55      * Gets the logs.
56      *
57      * @return array An array of logs
58      */
59     public function getLogs()
60     {
61         return isset($this->data['logs']) ? $this->data['logs'] : array();
62     }
63
64     public function getPriorities()
65     {
66         return isset($this->data['priorities']) ? $this->data['priorities'] : array();
67     }
68
69     public function countErrors()
70     {
71         return isset($this->data['error_count']) ? $this->data['error_count'] : 0;
72     }
73
74     public function countDeprecations()
75     {
76         return isset($this->data['deprecation_count']) ? $this->data['deprecation_count'] : 0;
77     }
78
79     public function countWarnings()
80     {
81         return isset($this->data['warning_count']) ? $this->data['warning_count'] : 0;
82     }
83
84     public function countScreams()
85     {
86         return isset($this->data['scream_count']) ? $this->data['scream_count'] : 0;
87     }
88
89     /**
90      * {@inheritdoc}
91      */
92     public function getName()
93     {
94         return 'logger';
95     }
96
97     private function sanitizeLogs($logs)
98     {
99         $sanitizedLogs = array();
100
101         foreach ($logs as $log) {
102             if (!$this->isSilencedOrDeprecationErrorLog($log)) {
103                 $log['context'] = $log['context'] ? $this->cloneVar($log['context']) : $log['context'];
104                 $sanitizedLogs[] = $log;
105
106                 continue;
107             }
108
109             $exception = $log['context']['exception'];
110             $errorId = md5("{$exception->getSeverity()}/{$exception->getLine()}/{$exception->getFile()}".($exception instanceof \Exception ? "\0".$exception->getMessage() : ''), true);
111
112             if (isset($sanitizedLogs[$errorId])) {
113                 ++$sanitizedLogs[$errorId]['errorCount'];
114             } else {
115                 $log['context'] = $log['context'] ? $this->cloneVar($log['context']) : $log['context'];
116
117                 $log += array(
118                     'errorCount' => 1,
119                     'scream' => $exception instanceof SilencedErrorContext,
120                 );
121
122                 $sanitizedLogs[$errorId] = $log;
123             }
124         }
125
126         return array_values($sanitizedLogs);
127     }
128
129     private function isSilencedOrDeprecationErrorLog(array $log)
130     {
131         if (!isset($log['context']['exception'])) {
132             return false;
133         }
134
135         $exception = $log['context']['exception'];
136
137         if ($exception instanceof SilencedErrorContext) {
138             return true;
139         }
140
141         if ($exception instanceof \ErrorException && in_array($exception->getSeverity(), array(E_DEPRECATED, E_USER_DEPRECATED), true)) {
142             return true;
143         }
144
145         return false;
146     }
147
148     private function computeErrorsCount()
149     {
150         $count = array(
151             'error_count' => $this->logger->countErrors(),
152             'deprecation_count' => 0,
153             'warning_count' => 0,
154             'scream_count' => 0,
155             'priorities' => array(),
156         );
157
158         foreach ($this->logger->getLogs() as $log) {
159             if (isset($count['priorities'][$log['priority']])) {
160                 ++$count['priorities'][$log['priority']]['count'];
161             } else {
162                 $count['priorities'][$log['priority']] = array(
163                     'count' => 1,
164                     'name' => $log['priorityName'],
165                 );
166             }
167             if ('WARNING' === $log['priorityName']) {
168                 ++$count['warning_count'];
169             }
170
171             if ($this->isSilencedOrDeprecationErrorLog($log)) {
172                 if ($log['context']['exception'] instanceof SilencedErrorContext) {
173                     ++$count['scream_count'];
174                 } else {
175                     ++$count['deprecation_count'];
176                 }
177             }
178         }
179
180         ksort($count['priorities']);
181
182         return $count;
183     }
184 }