Skip to content

Commit 474e855

Browse files
authored
Merge pull request #555 from php-enqueue/loging-improvements
[consumption] Logging improvements
2 parents 50237e6 + 3043106 commit 474e855

27 files changed

+1214
-266
lines changed

pkg/enqueue/Client/ConsumptionExtension/FlushSpoolProducerExtension.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ class FlushSpoolProducerExtension implements PostMessageReceivedExtensionInterfa
1515
*/
1616
private $producer;
1717

18-
/**
19-
* @param SpoolProducer $producer
20-
*/
2118
public function __construct(SpoolProducer $producer)
2219
{
2320
$this->producer = $producer;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace Enqueue\Client\ConsumptionExtension;
4+
5+
use Enqueue\Client\Config;
6+
use Enqueue\Consumption\Context\PostMessageReceived;
7+
use Enqueue\Consumption\Result;
8+
use Enqueue\Util\Stringify;
9+
use Psr\Log\LogLevel;
10+
11+
class LogExtension extends \Enqueue\Consumption\Extension\LogExtension
12+
{
13+
public function onPostMessageReceived(PostMessageReceived $context): void
14+
{
15+
$result = $context->getResult();
16+
$message = $context->getMessage();
17+
18+
$logLevel = Result::REJECT == ((string) $result) ? LogLevel::ERROR : LogLevel::INFO;
19+
20+
if ($command = $message->getProperty(Config::COMMAND)) {
21+
$reason = '';
22+
$logMessage = "[client] Processed {command}\t{body}\t{result}";
23+
if ($result instanceof Result && $result->getReason()) {
24+
$reason = $result->getReason();
25+
26+
$logMessage .= ' {reason}';
27+
}
28+
29+
$context->getLogger()->log($logLevel, $logMessage, [
30+
'result' => str_replace('enqueue.', '', $result),
31+
'reason' => $reason,
32+
'command' => $command,
33+
'queueName' => $context->getConsumer()->getQueue()->getQueueName(),
34+
'body' => Stringify::that($message->getBody()),
35+
'properties' => Stringify::that($message->getProperties()),
36+
'headers' => Stringify::that($message->getHeaders()),
37+
]);
38+
39+
return;
40+
}
41+
42+
$topic = $message->getProperty(Config::TOPIC);
43+
$processor = $message->getProperty(Config::PROCESSOR);
44+
if ($topic && $processor) {
45+
$reason = '';
46+
$logMessage = "[client] Processed {topic} -> {processor}\t{body}\t{result}";
47+
if ($result instanceof Result && $result->getReason()) {
48+
$reason = $result->getReason();
49+
50+
$logMessage .= ' {reason}';
51+
}
52+
53+
$context->getLogger()->log($logLevel, $logMessage, [
54+
'result' => str_replace('enqueue.', '', $result),
55+
'reason' => $reason,
56+
'topic' => $topic,
57+
'processor' => $processor,
58+
'queueName' => $context->getConsumer()->getQueue()->getQueueName(),
59+
'body' => Stringify::that($message->getBody()),
60+
'properties' => Stringify::that($message->getProperties()),
61+
'headers' => Stringify::that($message->getHeaders()),
62+
]);
63+
64+
return;
65+
}
66+
67+
parent::onPostMessageReceived($context);
68+
}
69+
}

pkg/enqueue/Consumption/ChainExtension.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Enqueue\Consumption;
44

55
use Enqueue\Consumption\Context\End;
6+
use Enqueue\Consumption\Context\InitLogger;
67
use Enqueue\Consumption\Context\MessageReceived;
78
use Enqueue\Consumption\Context\MessageResult;
89
use Enqueue\Consumption\Context\PostConsume;
@@ -15,6 +16,7 @@
1516
class ChainExtension implements ExtensionInterface
1617
{
1718
private $startExtensions;
19+
private $initLoggerExtensions;
1820
private $preSubscribeExtensions;
1921
private $preConsumeExtensions;
2022
private $messageReceivedExtensions;
@@ -24,12 +26,10 @@ class ChainExtension implements ExtensionInterface
2426
private $postConsumeExtensions;
2527
private $endExtensions;
2628

27-
/**
28-
* @param ExtensionInterface[] $extensions
29-
*/
3029
public function __construct(array $extensions)
3130
{
3231
$this->startExtensions = [];
32+
$this->initLoggerExtensions = [];
3333
$this->preSubscribeExtensions = [];
3434
$this->preConsumeExtensions = [];
3535
$this->messageReceivedExtensions = [];
@@ -42,6 +42,7 @@ public function __construct(array $extensions)
4242
array_walk($extensions, function ($extension) {
4343
if ($extension instanceof ExtensionInterface) {
4444
$this->startExtensions[] = $extension;
45+
$this->initLoggerExtensions[] = $extension;
4546
$this->preSubscribeExtensions[] = $extension;
4647
$this->preConsumeExtensions[] = $extension;
4748
$this->messageReceivedExtensions[] = $extension;
@@ -61,6 +62,12 @@ public function __construct(array $extensions)
6162
$extensionValid = true;
6263
}
6364

65+
if ($extension instanceof InitLoggerExtensionInterface) {
66+
$this->initLoggerExtensions[] = $extension;
67+
68+
$extensionValid = true;
69+
}
70+
6471
if ($extension instanceof PreSubscribeExtensionInterface) {
6572
$this->preSubscribeExtensions[] = $extension;
6673

@@ -115,6 +122,13 @@ public function __construct(array $extensions)
115122
});
116123
}
117124

125+
public function onInitLogger(InitLogger $context): void
126+
{
127+
foreach ($this->initLoggerExtensions as $extension) {
128+
$extension->onInitLogger($context);
129+
}
130+
}
131+
118132
public function onStart(Start $context): void
119133
{
120134
foreach ($this->startExtensions as $extension) {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Enqueue\Consumption\Context;
4+
5+
use Psr\Log\LoggerInterface;
6+
7+
class InitLogger
8+
{
9+
/**
10+
* @var LoggerInterface
11+
*/
12+
private $logger;
13+
14+
public function __construct(LoggerInterface $logger)
15+
{
16+
$this->logger = $logger;
17+
}
18+
19+
public function getLogger(): LoggerInterface
20+
{
21+
return $this->logger;
22+
}
23+
24+
public function changeLogger(LoggerInterface $logger): void
25+
{
26+
$this->logger = $logger;
27+
}
28+
}

pkg/enqueue/Consumption/Context/PostMessageReceived.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Enqueue\Consumption\Context;
44

55
use Enqueue\Consumption\Result;
6+
use Interop\Queue\Consumer;
67
use Interop\Queue\Context;
78
use Interop\Queue\Message;
89
use Psr\Log\LoggerInterface;
@@ -14,6 +15,11 @@ final class PostMessageReceived
1415
*/
1516
private $context;
1617

18+
/**
19+
* @var Consumer
20+
*/
21+
private $consumer;
22+
1723
/**
1824
* @var Message
1925
*/
@@ -41,12 +47,14 @@ final class PostMessageReceived
4147

4248
public function __construct(
4349
Context $context,
50+
Consumer $consumer,
4451
Message $message,
4552
$result,
4653
int $receivedAt,
4754
LoggerInterface $logger
4855
) {
4956
$this->context = $context;
57+
$this->consumer = $consumer;
5058
$this->message = $message;
5159
$this->result = $result;
5260
$this->receivedAt = $receivedAt;
@@ -60,6 +68,11 @@ public function getContext(): Context
6068
return $this->context;
6169
}
6270

71+
public function getConsumer(): Consumer
72+
{
73+
return $this->consumer;
74+
}
75+
6376
public function getMessage(): Message
6477
{
6578
return $this->message;

pkg/enqueue/Consumption/Context/Start.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,6 @@ public function getLogger(): LoggerInterface
6262
return $this->logger;
6363
}
6464

65-
public function changeLogger(LoggerInterface $logger): void
66-
{
67-
$this->logger = $logger;
68-
}
69-
7065
/**
7166
* In milliseconds.
7267
*/
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
namespace Enqueue\Consumption\Extension;
4+
5+
use Enqueue\Consumption\Context\End;
6+
use Enqueue\Consumption\Context\MessageReceived;
7+
use Enqueue\Consumption\Context\PostMessageReceived;
8+
use Enqueue\Consumption\Context\Start;
9+
use Enqueue\Consumption\EndExtensionInterface;
10+
use Enqueue\Consumption\MessageReceivedExtensionInterface;
11+
use Enqueue\Consumption\PostMessageReceivedExtensionInterface;
12+
use Enqueue\Consumption\Result;
13+
use Enqueue\Consumption\StartExtensionInterface;
14+
use Enqueue\Util\Stringify;
15+
use Psr\Log\LogLevel;
16+
17+
class LogExtension implements StartExtensionInterface, MessageReceivedExtensionInterface, PostMessageReceivedExtensionInterface, EndExtensionInterface
18+
{
19+
public function onStart(Start $context): void
20+
{
21+
$context->getLogger()->debug('Consumption has started');
22+
}
23+
24+
public function onEnd(End $context): void
25+
{
26+
$context->getLogger()->debug('Consumption has ended');
27+
}
28+
29+
public function onMessageReceived(MessageReceived $context): void
30+
{
31+
$message = $context->getMessage();
32+
33+
$context->getLogger()->debug("Received from {queueName}\t{body}", [
34+
'queueName' => $context->getConsumer()->getQueue()->getQueueName(),
35+
'redelivered' => $message->isRedelivered(),
36+
'body' => Stringify::that($message->getBody()),
37+
'properties' => Stringify::that($message->getProperties()),
38+
'headers' => Stringify::that($message->getHeaders()),
39+
]);
40+
}
41+
42+
public function onPostMessageReceived(PostMessageReceived $context): void
43+
{
44+
$message = $context->getMessage();
45+
$queue = $context->getConsumer()->getQueue();
46+
$result = $context->getResult();
47+
48+
$reason = '';
49+
$logMessage = "Processed from {queueName}\t{body}\t{result}";
50+
if ($result instanceof Result && $result->getReason()) {
51+
$reason = $result->getReason();
52+
$logMessage .= ' {reason}';
53+
}
54+
$logContext = [
55+
'result' => str_replace('enqueue.', '', $result),
56+
'reason' => $reason,
57+
'queueName' => $queue->getQueueName(),
58+
'body' => Stringify::that($message->getBody()),
59+
'properties' => Stringify::that($message->getProperties()),
60+
'headers' => Stringify::that($message->getHeaders()),
61+
];
62+
63+
$logLevel = Result::REJECT == ((string) $result) ? LogLevel::ERROR : LogLevel::INFO;
64+
65+
$context->getLogger()->log($logLevel, $logMessage, $logContext);
66+
}
67+
}

pkg/enqueue/Consumption/Extension/LoggerExtension.php

Lines changed: 8 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,11 @@
22

33
namespace Enqueue\Consumption\Extension;
44

5-
use Enqueue\Consumption\Context\PostMessageReceived;
6-
use Enqueue\Consumption\Context\Start;
7-
use Enqueue\Consumption\PostMessageReceivedExtensionInterface;
8-
use Enqueue\Consumption\Result;
9-
use Enqueue\Consumption\StartExtensionInterface;
10-
use Interop\Queue\Message as InteropMessage;
5+
use Enqueue\Consumption\Context\InitLogger;
6+
use Enqueue\Consumption\InitLoggerExtensionInterface;
117
use Psr\Log\LoggerInterface;
12-
use Psr\Log\NullLogger;
138

14-
class LoggerExtension implements StartExtensionInterface, PostMessageReceivedExtensionInterface
9+
class LoggerExtension implements InitLoggerExtensionInterface
1510
{
1611
/**
1712
* @var LoggerInterface
@@ -26,59 +21,14 @@ public function __construct(LoggerInterface $logger)
2621
$this->logger = $logger;
2722
}
2823

29-
public function onStart(Start $context): void
24+
public function onInitLogger(InitLogger $context): void
3025
{
31-
if ($context->getLogger() && false == $context->getLogger() instanceof NullLogger) {
32-
$context->getLogger()->debug(sprintf(
33-
'Skip setting context\'s logger "%s". Another one "%s" has already been set.',
34-
get_class($this->logger),
35-
get_class($context->getLogger())
36-
));
37-
} else {
38-
$context->changeLogger($this->logger);
39-
$this->logger->debug(sprintf('Set context\'s logger "%s"', get_class($this->logger)));
40-
}
41-
}
42-
43-
public function onPostMessageReceived(PostMessageReceived $context): void
44-
{
45-
if (false == $context->getResult() instanceof Result) {
46-
return;
47-
}
48-
49-
/** @var $result Result */
50-
$result = $context->getResult();
26+
$previousLogger = $context->getLogger();
5127

52-
switch ($result->getStatus()) {
53-
case Result::REJECT:
54-
case Result::REQUEUE:
55-
if ($result->getReason()) {
56-
$this->logger->error($result->getReason(), $this->messageToLogContext($context->getMessage()));
57-
}
58-
59-
break;
60-
case Result::ACK:
61-
if ($result->getReason()) {
62-
$this->logger->info($result->getReason(), $this->messageToLogContext($context->getMessage()));
63-
}
28+
if ($previousLogger !== $this->logger) {
29+
$context->changeLogger($this->logger);
6430

65-
break;
66-
default:
67-
throw new \LogicException(sprintf('Got unexpected message result. "%s"', $result->getStatus()));
31+
$this->logger->debug(sprintf('Change logger from "%s" to "%s"', get_class($previousLogger), get_class($this->logger)));
6832
}
6933
}
70-
71-
/**
72-
* @param InteropMessage $message
73-
*
74-
* @return array
75-
*/
76-
private function messageToLogContext(InteropMessage $message)
77-
{
78-
return [
79-
'body' => $message->getBody(),
80-
'headers' => $message->getHeaders(),
81-
'properties' => $message->getProperties(),
82-
];
83-
}
8434
}

pkg/enqueue/Consumption/ExtensionInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
namespace Enqueue\Consumption;
44

5-
interface ExtensionInterface extends StartExtensionInterface, PreSubscribeExtensionInterface, PreConsumeExtensionInterface, MessageReceivedExtensionInterface, PostMessageReceivedExtensionInterface, MessageResultExtensionInterface, ProcessorExceptionExtensionInterface, PostConsumeExtensionInterface, EndExtensionInterface
5+
interface ExtensionInterface extends StartExtensionInterface, PreSubscribeExtensionInterface, PreConsumeExtensionInterface, MessageReceivedExtensionInterface, PostMessageReceivedExtensionInterface, MessageResultExtensionInterface, ProcessorExceptionExtensionInterface, PostConsumeExtensionInterface, EndExtensionInterface, InitLoggerExtensionInterface
66
{
77
}

0 commit comments

Comments
 (0)