From 2bff625abe71a95f22b55a0425a50faeca7c6abe Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 12 Mar 2019 19:04:35 +0100 Subject: [PATCH] [Messenger] deprecate LoggingMiddleware in favor of providing a logger to SendMessageMiddleware --- UPGRADE-4.3.md | 1 + UPGRADE-5.0.md | 5 +++ .../FrameworkExtension.php | 2 +- .../Resources/config/messenger.xml | 14 ++++--- .../FrameworkExtensionTest.php | 2 - src/Symfony/Component/Messenger/CHANGELOG.md | 4 +- .../Command/ConsumeMessagesCommand.php | 4 +- .../Middleware/HandleMessageMiddleware.php | 24 ++++++++++-- .../Middleware/LoggingMiddleware.php | 4 +- .../Middleware/SendMessageMiddleware.php | 37 ++++++++++++++----- .../Middleware/LoggingMiddlewareTest.php | 3 ++ src/Symfony/Component/Messenger/composer.json | 4 +- 12 files changed, 75 insertions(+), 29 deletions(-) diff --git a/UPGRADE-4.3.md b/UPGRADE-4.3.md index dc19c8b360947..5415884901775 100644 --- a/UPGRADE-4.3.md +++ b/UPGRADE-4.3.md @@ -61,6 +61,7 @@ Messenger --------- * `Amqp` transport does not throw `\AMQPException` anymore, catch `TransportException` instead. + * Deprecated the `LoggingMiddleware` class, pass a logger to `SendMessageMiddleware` instead. Routing ------- diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md index 8232d24a42ab1..3662374ef83e4 100644 --- a/UPGRADE-5.0.md +++ b/UPGRADE-5.0.md @@ -207,6 +207,11 @@ HttpKernel * Removed `ConfigDataCollector::getApplicationName()` * Removed `ConfigDataCollector::getApplicationVersion()` +Messenger +--------- + + * The `LoggingMiddleware` class has been removed, pass a logger to `SendMessageMiddleware` instead. + Monolog ------- diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 240912b33b329..391408a348f4c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1598,7 +1598,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder } $defaultMiddleware = [ - 'before' => [['id' => 'logging']], + 'before' => [], 'after' => [['id' => 'send_message'], ['id' => 'handle_message']], ]; foreach ($config['buses'] as $busId => $bus) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml index 1be0a9977c2e4..4997fdf5d0f1a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml @@ -13,7 +13,11 @@ + + + + @@ -28,7 +32,11 @@ + + + + @@ -39,12 +47,6 @@ - - - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 1afe5f199c14d..1bbd048319b5a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -701,14 +701,12 @@ public function testMessengerWithMultipleBuses() $this->assertTrue($container->has('messenger.bus.commands')); $this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0)); $this->assertEquals([ - ['id' => 'logging'], ['id' => 'send_message'], ['id' => 'handle_message'], ], $container->getParameter('messenger.bus.commands.middleware')); $this->assertTrue($container->has('messenger.bus.events')); $this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0)); $this->assertEquals([ - ['id' => 'logging'], ['id' => 'with_factory', 'arguments' => ['foo', true, ['bar' => 'baz']]], ['id' => 'send_message'], ['id' => 'handle_message'], diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index b7f604f41c00c..7166c1b832dd4 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -6,15 +6,13 @@ CHANGELOG * Added `PhpSerializer` which uses PHP's native `serialize()` and `unserialize()` to serialize messages to a transport - * [BC BREAK] If no serializer were passed, the default serializer changed from `Serializer` to `PhpSerializer` inside `AmqpReceiver`, `AmqpSender`, `AmqpTransport` and `AmqpTransportFactory`. - * Added `TransportException` to mark an exception transport-related - * [BC BREAK] If listening to exceptions while using `AmqpSender` or `AmqpReceiver`, `\AMQPException` is no longer thrown in favor of `TransportException`. + * Deprecated `LoggingMiddleware`, pass a logger to `SendMessageMiddleware` instead. 4.2.0 ----- diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index f50816b34976e..5f854f257f792 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -170,8 +170,8 @@ protected function execute(InputInterface $input, OutputInterface $output): void $io->comment('Quit the worker with CONTROL-C.'); - if (!$output->isDebug()) { - $io->comment('Re-run the command with a -vvv option to see logs about consumed messages.'); + if (OutputInterface::VERBOSITY_VERBOSE > $output->getVerbosity()) { + $io->comment('Re-run the command with a -vv option to see logs about consumed messages.'); } $worker = new Worker($receiver, $bus); diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index ba89051f24d3e..ed47ac6389128 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Messenger\Middleware; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\NullLogger; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\NoHandlerForMessageException; use Symfony\Component\Messenger\Handler\HandlersLocatorInterface; @@ -23,6 +25,8 @@ */ class HandleMessageMiddleware implements MiddlewareInterface { + use LoggerAwareTrait; + private $handlersLocator; private $allowNoHandlers; @@ -30,6 +34,7 @@ public function __construct(HandlersLocatorInterface $handlersLocator, bool $all { $this->handlersLocator = $handlersLocator; $this->allowNoHandlers = $allowNoHandlers; + $this->logger = new NullLogger(); } /** @@ -41,11 +46,24 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope { $handler = null; $message = $envelope->getMessage(); + + $context = [ + 'message' => $message, + 'class' => \get_class($message), + ]; + foreach ($this->handlersLocator->getHandlers($envelope) as $alias => $handler) { - $envelope = $envelope->with(HandledStamp::fromCallable($handler, $handler($message), \is_string($alias) ? $alias : null)); + $handledStamp = HandledStamp::fromCallable($handler, $handler($message), \is_string($alias) ? $alias : null); + $envelope = $envelope->with($handledStamp); + $this->logger->info('Message "{class}" handled by "{handler}"', $context + ['handler' => $handledStamp->getCallableName()]); } - if (null === $handler && !$this->allowNoHandlers) { - throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', \get_class($envelope->getMessage()))); + + if (null === $handler) { + if (!$this->allowNoHandlers) { + throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $context['class'])); + } + + $this->logger->info('No handler for message "{class}"', $context); } return $stack->next()->handle($envelope, $stack); diff --git a/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php b/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php index 7518d018b8375..a2941055fa67d 100644 --- a/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php @@ -11,13 +11,15 @@ namespace Symfony\Component\Messenger\Middleware; +@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, pass a logger to SendMessageMiddleware instead.', LoggingMiddleware::class), E_USER_DEPRECATED); + use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Envelope; /** * @author Samuel Roze * - * @experimental in 4.2 + * @deprecated since 4.3, pass a logger to SendMessageMiddleware instead */ class LoggingMiddleware implements MiddlewareInterface { diff --git a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php index 7c0ee4a488874..6d6696a4721bd 100644 --- a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Messenger\Middleware; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\NullLogger; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\ReceivedStamp; use Symfony\Component\Messenger\Stamp\SentStamp; @@ -24,11 +26,14 @@ */ class SendMessageMiddleware implements MiddlewareInterface { + use LoggerAwareTrait; + private $sendersLocator; public function __construct(SendersLocatorInterface $sendersLocator) { $this->sendersLocator = $sendersLocator; + $this->logger = new NullLogger(); } /** @@ -36,19 +41,33 @@ public function __construct(SendersLocatorInterface $sendersLocator) */ public function handle(Envelope $envelope, StackInterface $stack): Envelope { - if ($envelope->all(ReceivedStamp::class)) { - // it's a received message, do not send it back - return $stack->next()->handle($envelope, $stack); - } + $context = [ + 'message' => $envelope->getMessage(), + 'class' => \get_class($envelope->getMessage()), + ]; + $handle = false; $sender = null; - foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) { - $envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null)); - } + try { + if ($envelope->all(ReceivedStamp::class)) { + // it's a received message, do not send it back + $this->logger->info('Received message "{class}"', $context); + } else { + foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) { + $this->logger->info('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]); + $envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null)); + } + } + + if (null === $sender || $handle) { + return $stack->next()->handle($envelope, $stack); + } + } catch (\Throwable $e) { + $context['exception'] = $e; + $this->logger->warning('An exception occurred while handling message "{class}"', $context); - if (null === $sender || $handle) { - return $stack->next()->handle($envelope, $stack); + throw $e; } // message should only be sent and not be handled by the next middleware diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/LoggingMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/LoggingMiddlewareTest.php index b8f401535931f..675ff76730471 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/LoggingMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/LoggingMiddlewareTest.php @@ -17,6 +17,9 @@ use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; +/** + * @group legacy + */ class LoggingMiddlewareTest extends MiddlewareTestCase { public function testDebugLogAndNextMiddleware() diff --git a/src/Symfony/Component/Messenger/composer.json b/src/Symfony/Component/Messenger/composer.json index f828b64451943..d0b6fe31f9888 100644 --- a/src/Symfony/Component/Messenger/composer.json +++ b/src/Symfony/Component/Messenger/composer.json @@ -16,10 +16,10 @@ } ], "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "psr/log": "~1.0" }, "require-dev": { - "psr/log": "~1.0", "symfony/console": "~3.4|~4.0", "symfony/dependency-injection": "~3.4.19|^4.1.8", "symfony/http-kernel": "~3.4|~4.0",