8000 Reset loggers on workers · symfony/symfony@3845558 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3845558

Browse files
committed
Reset loggers on workers
1 parent 0f96ac7 commit 3845558

File tree

4 files changed

+150
-1
lines changed

4 files changed

+150
-1
lines changed

src/Symfony/Bridge/Monolog/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
CHANGELOG
22
=========
33

4+
5.4.0
5+
-----
6+
* Added `ResetLoggersWorkerSubscriber` to reset buffered logs in messenger workers
7+
48
5.2.0
59
-----
610

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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\Bridge\Monolog\Messenger;
13+
14+
use Monolog\ResettableInterface;
15+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16+
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
17+
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
18+
19+
/**
20+
* Reset loggers between messages being handled to release buffered handler logs.
21+
*
22+
* @author Laurent VOULLEMIER <laurent.voullemier@gmail.com>
23+
*/
24+
class ResetLoggersWorkerSubscriber implements EventSubscriberInterface
25+
{
26+
private $loggers;
27+
28+
public function __construct(iterable $loggers)
29+
{
30+
$this->loggers = $loggers;
31+
}
32+
33+
public function onWorkerMessageHandled(): void
34+
{
35+
$this->resetLoggers();
36+
}
37+
38+
public function onWorkerMessageFailed(): void
39+
{
40+
$this->resetLoggers();
41+
}
42+
43+
public static function getSubscribedEvents(): array
44+
{
45+
return [
46+
WorkerMessageHandledEvent::class => 'onWorkerMessageHandled',
47+
WorkerMessageFailedEvent::class => 'onWorkerMessageFailed',
48+
];
49+
}
50+
51+
private function resetLoggers(): void
52+
{
53+
foreach ($this->loggers as $logger) {
54+
if ($logger instanceof ResettableInterface) {
55+
$logger->reset();
56+
}
57+
}
58+
}
59+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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\Bridge\Monolog\Tests\Messenger;
13+
14+
use Monolog\Handler\BufferHandler;
15+
use Monolog\Handler\TestHandler;
16+
use PHPUnit\Framework\TestCase;
17+
use Symfony\Bridge\Monolog\Logger;
18+
use Symfony\Bridge\Monolog\Messenger\ResetLoggersWorkerSubscriber;
19+
use Symfony\Component\EventDispatcher\EventDispatcher;
20+
use Symfony\Component\Messenger\Envelope;
21+
use Symfony\Component\Messenger\Event\WorkerRunningEvent;
22+
use Symfony\Component\Messenger\Handler\HandlersLocator;
23+
use Symfony\Component\Messenger\MessageBus;
24+
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
25+
use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
26+
use Symfony\Component\Messenger\Worker;
27+
28+
class ResetLoggersWorkerTest extends TestCase
29+
{
30+
public function testLogsAreFlushed()
31+
{
32+
$loggerTestHandler = new TestHandler();
33+
$loggerTestHandler->setSkipReset(true);
34+
35+
$logger = new Logger('', [new BufferHandler($loggerTestHandler)]);
36+
37+
$message = new class() {
38+
};
39+
40+
$handler = static function (object $message) use ($logger): void {
41+
$logger->info('Message of class {class} is being handled', ['class' => \get_class($message)]);
42+
};
43+
44+
$handlersMiddleware = new HandleMessageMiddleware(new HandlersLocator([
45+
\get_class($message) => [$handler],
46+
]));
47+
48+
$eventDispatcher = new EventDispatcher();
49+
$eventDispatcher->addSubscriber(new ResetLoggersWorkerSubscriber([$logger]));
50+
$eventDispatcher->addListener(WorkerRunningEvent::class, static function (WorkerRunningEvent $event): void {
51+
$event->getWorker()->stop(); // Limit the worker to one loop
52+
});
53+
54+
$bus = new MessageBus([$handlersMiddleware]);
55+
$worker = new Worker([$this->createReceiver($message)], $bus, $eventDispatcher);
56+
$worker->run();
57+
58+
$this->assertCount(1, $loggerTestHandler->getRecords());
59+
}
60+
61+
private function createReceiver(object $message): ReceiverInterface
62+
{
63+
return new class($message) implements ReceiverInterface {
64+
private $message;
65+
66+
public function __construct(object $message)
67+
{
68+
$this->message = $message;
69+
}
70+
71+
public function get(): iterable
72+
{
73+
return [new Envelope($this->message)];
74+
}
75+
76+
public function ack(Envelope $envelope): void
77+
{
78+
}
79+
80+
public function reject(Envelope $envelope): void
81+
{
82+
}
83+
};
84+
}
85+
}

src/Symfony/Bridge/Monolog/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"symfony/security-core": "^4.4|^5.0",
2929
"symfony/var-dumper": "^4.4|^5.0",
3030
"symfony/mailer": "^4.4|^5.0",
31-
"symfony/mime": "^4.4|^5.0"
31+
"symfony/mime": "^4.4|^5.0",
32+
"symfony/messenger": "^4.4|^5.0"
3233
},
3334
"conflict": {
3435
"symfony/console": "<4.4",

0 commit comments

Comments
 (0)
0