Skip to content

Commit c02cedd

Browse files
committed
LoggerDataCollector: splitting logs on different sub-requests
1 parent 84f4fb6 commit c02cedd

File tree

4 files changed

+69
-12
lines changed

4 files changed

+69
-12
lines changed

src/Symfony/Bridge/Monolog/Logger.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Logger extends BaseLogger implements DebugLoggerInterface
2727
public function getLogs()
2828
{
2929
if ($logger = $this->getDebugLogger()) {
30-
return $logger->getLogs();
30+
return call_user_func_array(array($logger, 'getLogs'), func_get_args());
3131
}
3232

3333
return array();
@@ -39,7 +39,7 @@ public function getLogs()
3939
public function countErrors()
4040
{
4141
if ($logger = $this->getDebugLogger()) {
42-
return $logger->countErrors();
42+
return call_user_func_array(array($logger, 'countErrors'), func_get_args());
4343
}
4444

4545
return 0;

src/Symfony/Bridge/Monolog/Processor/DebugProcessor.php

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,47 @@
1212
namespace Symfony\Bridge\Monolog\Processor;
1313

1414
use Monolog\Logger;
15+
use Symfony\Component\HttpFoundation\RequestStack;
16+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1517
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
1618

1719
class DebugProcessor implements DebugLoggerInterface
1820
{
19-
private $records = array();
20-
private $errorCount = 0;
21+
private $recordsRequest = array();
22+
private $requestStack;
23+
private $masterRequestHash;
24+
25+
public function __construct(RequestStack $requestStack = null)
26+
{
27+
$this->requestStack = $requestStack;
28+
}
2129

2230
public function __invoke(array $record)
2331
{
24-
$this->records[] = array(
32+
$hash = '';
33+
if ($this->requestStack && $request = $this->requestStack->getCurrentRequest()) {
34+
$hash = spl_object_hash($request);
35+
}
36+
37+
$this->recordsRequest[$hash]['records'][] = array(
2538
'timestamp' => $record['datetime']->getTimestamp(),
2639
'message' => $record['message'],
2740
'priority' => $record['level'],
2841
'priorityName' => $record['level_name'],
2942
'context' => $record['context'],
3043
'channel' => isset($record['channel']) ? $record['channel'] : '',
3144
);
45+
46+
if (!isset($this->recordsRequest[$hash]['errorCount'])) {
47+
$this->recordsRequest[$hash]['errorCount'] = 0;
48+
}
49+
3250
switch ($record['level']) {
3351
case Logger::ERROR:
3452
case Logger::CRITICAL:
3553
case Logger::ALERT:
3654
case Logger::EMERGENCY:
37-
++$this->errorCount;
55+
++$this->recordsRequest[$hash]['errorCount'];
3856
}
3957

4058
return $record;
@@ -45,14 +63,50 @@ public function __invoke(array $record)
4563
*/
4664
public function getLogs()
4765
{
48-
return $this->records;
66+
if (0 === count($this->recordsRequest)) {
67+
return array();
68+
}
69+
70+
if (1 === func_num_args()) {
71+
$requestHash = func_get_arg(0);
72+
if (isset($this->recordsRequest[$requestHash]['records']) && $requestHash !== $this->masterRequestHash) {
73+
return $this->recordsRequest[$requestHash]['records'];
74+
}
75+
}
76+
$records = array_column($this->recordsRequest, 'records');
77+
78+
return call_user_func_array('array_merge', $records);
4979
}
5080

5181
/**
5282
* {@inheritdoc}
5383
*/
5484
public function countErrors()
5585
{
56-
return $this->errorCount;
86+
if (0 === count($this->recordsRequest)) {
87+
return 0;
88+
}
89+
90+
if (1 === func_num_args()) {
91+
$requestHash = func_get_arg(0);
92+
if (isset($this->recordsRequest[$requestHash]['errorCount']) && $requestHash !== $this->masterRequestHash) {
93+
return $this->recordsRequest[$requestHash]['errorCount'];
94+
}
95+
}
96+
$errors = array_column($this->recordsRequest, 'errorCount');
97+
98+
return array_sum($errors);
99+
}
100+
101+
/**
102+
* @param GetResponseEvent $event
103+
*/
104+
public function onKernelRequest(GetResponseEvent $event)
105+
{
106+
if (null !== $this->masterRequestHash || !$event->isMasterRequest()) {
107+
return;
108+
}
109+
110+
$this->masterRequestHash = spl_object_hash($event->getRequest());
57111
}
58112
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,8 @@ private function registerDebugConfiguration(array $config, ContainerBuilder $con
649649
if ($debug && class_exists(DebugProcessor::class)) {
650650
$definition = new Definition(DebugProcessor::class);
651651
$definition->setPublic(false);
652+
$definition->addArgument(new Reference('request_stack'));
653+
$definition->addTag('kernel.event_listener', array('event' => 'kernel.request'));
652654
$container->setDefinition('debug.log_processor', $definition);
653655
}
654656
}

src/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class LoggerDataCollector extends DataCollector implements LateDataCollectorInte
2525
{
2626
private $logger;
2727
private $containerPathPrefix;
28+
private $splRequestHash;
2829

2930
public function __construct($logger = null, $containerPathPrefix = null)
3031
{
@@ -40,7 +41,7 @@ public function __construct($logger = null, $containerPathPrefix = null)
4041
*/
4142
public function collect(Request $request, Response $response, \Exception $exception = null)
4243
{
43-
// everything is done as late as possible
44+
$this->splRequestHash = spl_object_hash($request);
4445
}
4546

4647
/**
@@ -52,7 +53,7 @@ public function lateCollect()
5253
$containerDeprecationLogs = $this->getContainerDeprecationLogs();
5354
$this->data = $this->computeErrorsCount($containerDeprecationLogs);
5455
$this->data['compiler_logs'] = $this->getContainerCompilerLogs();
55-
$this->data['logs'] = $this->sanitizeLogs(array_merge($this->logger->getLogs(), $containerDeprecationLogs));
56+
$this->data['logs'] = $this->sanitizeLogs(array_merge($this->logger->getLogs($this->splRequestHash), $containerDeprecationLogs));
5657
$this->data = $this->cloneVar($this->data);
5758
}
5859
}
@@ -217,14 +218,14 @@ private function computeErrorsCount(array $containerDeprecationLogs)
217218
{
218219
$silencedLogs = array();
219220
$count = array(
220-
'error_count' => $this->logger->countErrors(),
221+
'error_count' => $this->logger->countErrors($this->splRequestHash),
221222
'deprecation_count' => 0,
222223
'warning_count' => 0,
223224
'scream_count' => 0,
224225
'priorities' => array(),
225226
);
226227

227-
foreach ($this->logger->getLogs() as $log) {
228+
foreach ($this->logger->getLogs($this->splRequestHash) as $log) {
228229
if (isset($count['priorities'][$log['priority']])) {
229230
++$count['priorities'][$log['priority']]['count'];
230231
} else {

0 commit comments

Comments
 (0)