Skip to content

Commit 1ad6fc7

Browse files
committed
Fix priority with logger_prototype
1 parent 264cf5d commit 1ad6fc7

File tree

3 files changed

+56
-17
lines changed

3 files changed

+56
-17
lines changed

DependencyInjection/Compiler/AddProcessorsPass.php

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ class AddProcessorsPass implements CompilerPassInterface
2828
{
2929
use PriorityTaggedServiceTrait;
3030

31+
private $channelPass;
32+
33+
public function __construct(?LoggerChannelPass $channelPass = null)
34+
{
35+
$this->channelPass = $channelPass;
36+
}
37+
3138
public function process(ContainerBuilder $container)
3239
{
3340
if (!$container->hasDefinition('monolog.logger')) {
@@ -56,8 +63,8 @@ public function process(ContainerBuilder $container)
5663
}
5764

5865
if (!empty($tag['handler'])) {
59-
$definition = $container->findDefinition(\sprintf('monolog.handler.%s', $tag['handler']));
60-
$parentDef = $definition;
66+
$parentDef = $container->findDefinition(\sprintf('monolog.handler.%s', $tag['handler']));
67+
$definitions = [$parentDef];
6168
while (!$parentDef->getClass() && $parentDef instanceof ChildDefinition) {
6269
$parentDef = $container->findDefinition($parentDef->getParent());
6370
}
@@ -66,13 +73,18 @@ public function process(ContainerBuilder $container)
6673
throw new \InvalidArgumentException(\sprintf('The "%s" handler does not accept processors', $tag['handler']));
6774
}
6875
} elseif (!empty($tag['channel'])) {
69-
if ('app' === $tag['channel']) {
70-
$definition = $container->getDefinition('monolog.logger');
76+
$loggerId = 'app' === $tag['channel'] ? 'monolog.logger' : \sprintf('monolog.logger.%s', $tag['channel']);
77+
$definitions = [$container->getDefinition($loggerId)];
78+
} else {
79+
if ($this->channelPass) {
80+
$definitions = [];
81+
foreach ($this->channelPass->getChannels() as $channel) {
82+
$loggerId = 'app' === $channel ? 'monolog.logger' : \sprintf('monolog.logger.%s', $channel);
83+
$definitions[] = $container->getDefinition($loggerId);
84+
}
7185
} else {
72-
$definition = $container->getDefinition(\sprintf('monolog.logger.%s', $tag['channel']));
86+
$definitions = [$container->getDefinition('monolog.logger_prototype')];
7387
}
74-
} else {
75-
$definition = $container->getDefinition('monolog.logger_prototype');
7688
}
7789

7890
if (!empty($tag['method'])) {
@@ -81,7 +93,9 @@ public function process(ContainerBuilder $container)
8193
// If no method is defined, fallback to use __invoke
8294
$processor = $reference;
8395
}
84-
$definition->addMethodCall('pushProcessor', [$processor]);
96+
foreach ($definitions as $definition) {
97+
$definition->addMethodCall('pushProcessor', [$processor]);
98+
}
8599
}
86100
}
87101
}

MonologBundle.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public function build(ContainerBuilder $container)
3737

3838
$container->addCompilerPass($channelPass = new LoggerChannelPass());
3939
$container->addCompilerPass(new FixEmptyLoggerPass($channelPass));
40-
$container->addCompilerPass(new AddProcessorsPass());
40+
$container->addCompilerPass(new AddProcessorsPass($channelPass));
4141
$container->addCompilerPass(new AddSwiftMailerTransportPass());
4242
}
4343

Tests/DependencyInjection/Compiler/AddProcessorsPassTest.php

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PHPUnit\Framework\TestCase;
1717
use Symfony\Bridge\Monolog\Handler\ConsoleHandler;
1818
use Symfony\Bundle\MonologBundle\DependencyInjection\Compiler\AddProcessorsPass;
19+
use Symfony\Bundle\MonologBundle\DependencyInjection\Compiler\LoggerChannelPass;
1920
use Symfony\Component\Config\FileLocator;
2021
use Symfony\Component\DependencyInjection\ContainerBuilder;
2122
use Symfony\Component\DependencyInjection\Definition;
@@ -54,6 +55,18 @@ public function testHandlerProcessors()
5455
$this->assertCount(2, $calls);
5556
$this->assertEquals(['pushProcessor', [new TypedReference('processor+35+25', 'TestClass')]], $calls[0]);
5657
$this->assertEquals(['pushProcessor', [new TypedReference('processor+25+35', 'TestClass')]], $calls[1]);
58+
59+
$service = $container->getDefinition('monolog.logger');
60+
$calls = $service->getMethodCalls();
61+
$this->assertCount(2, $calls);
62+
$this->assertEquals(['useMicrosecondTimestamps', ['%monolog.use_microseconds%']], $calls[0]);
63+
$this->assertEquals(['pushProcessor', [new TypedReference('processor_all_channels+0', 'TestClass')]], $calls[1]);
64+
65+
$service = $container->getDefinition('monolog.logger.test');
66+
$calls = $service->getMethodCalls();
67+
$this->assertCount(2, $calls);
68+
$this->assertEquals(['pushProcessor', [new TypedReference('processor_test_channel-25', 'TestClass')]], $calls[0]);
69+
$this->assertEquals(['pushProcessor', [new TypedReference('processor_all_channels+0', 'TestClass')]], $calls[1]);
5770
}
5871

5972
public function testFailureOnHandlerWithoutPushProcessor()
@@ -88,6 +101,9 @@ protected function getContainer()
88101
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config'));
89102
$loader->load('monolog.xml');
90103

104+
$container->setParameter('monolog.additional_channels', ['test']);
105+
$container->setParameter('monolog.handlers_to_channels', []);
106+
91107
$definition = $container->getDefinition('monolog.logger_prototype');
92108
$container->setParameter('monolog.handler.console.class', ConsoleHandler::class);
93109
$container->setDefinition('monolog.handler.test', new Definition('%monolog.handler.console.class%', [100, false]));
@@ -100,39 +116,48 @@ protected function getContainer()
100116
$definition->addMethodCall('pushHandler', [new Reference('monolog.handler.priority_test')]);
101117
$definition->addMethodCall('pushHandler', [new Reference('monolog.handler.priority_test_2')]);
102118

103-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
119+
$service = new Definition('TestClass');
104120
$service->addTag('monolog.processor', ['handler' => 'test']);
105121
$container->setDefinition('test', $service);
106122

107-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
123+
$service = new Definition('TestClass');
108124
$service->addTag('monolog.processor', ['handler' => 'test2']);
109125
$container->setDefinition('test2', $service);
110126

111-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
127+
$service = new Definition('TestClass');
112128
$service->addTag('monolog.processor', ['handler' => 'priority_test', 'priority' => 10]);
113129
$container->setDefinition('processor+10', $service);
114130

115-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
131+
$service = new Definition('TestClass');
116132
$service->addTag('monolog.processor', ['handler' => 'priority_test', 'priority' => -10]);
117133
$container->setDefinition('processor-10', $service);
118134

119-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
135+
$service = new Definition('TestClass');
120136
$service->addTag('monolog.processor', ['handler' => 'priority_test', 'priority' => 20]);
121137
$container->setDefinition('processor+20', $service);
122138

123-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
139+
$service = new Definition('TestClass');
124140
$service->addTag('monolog.processor', ['handler' => 'priority_test', 'priority' => 35]);
125141
$service->addTag('monolog.processor', ['handler' => 'priority_test_2', 'priority' => 25]);
126142
$container->setDefinition('processor+35+25', $service);
127143

128-
$service = new Definition('TestClass', ['false', new Reference('logger')]);
144+
$service = new Definition('TestClass');
129145
$service->addTag('monolog.processor', ['handler' => 'priority_test', 'priority' => 25]);
130146
$service->addTag('monolog.processor', ['handler' => 'priority_test_2', 'priority' => 35]);
131147
$container->setDefinition('processor+25+35', $service);
132148

149+
$service = new Definition('TestClass');
150+
$service->addTag('monolog.processor', ['priority' => 0]);
151+
$container->setDefinition('processor_all_channels+0', $service);
152+
153+
$service = new Definition('TestClass');
154+
$service->addTag('monolog.processor', ['channel' => 'test', 'priority' => -25]);
155+
$container->setDefinition('processor_test_channel-25', $service);
156+
133157
$container->getCompilerPassConfig()->setOptimizationPasses([]);
134158
$container->getCompilerPassConfig()->setRemovingPasses([]);
135-
$container->addCompilerPass(new AddProcessorsPass());
159+
$container->addCompilerPass($channelPass = new LoggerChannelPass());
160+
$container->addCompilerPass(new AddProcessorsPass($channelPass));
136161
$container->compile();
137162

138163
return $container;

0 commit comments

Comments
 (0)