Skip to content

Commit 8ffe113

Browse files
committed
Merge pull request #81 from AmericanCouncils/filter_handler
Filter handler
2 parents 93970f8 + a228219 commit 8ffe113

File tree

9 files changed

+86
-8
lines changed

9 files changed

+86
-8
lines changed

DependencyInjection/Configuration.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@
7575
* - [stop_buffering]: bool to disable buffering once the handler has been activated, defaults to true
7676
* - [bubble]: bool, defaults to true
7777
*
78+
* - filter:
79+
* - handler: the wrapped handler's name
80+
* - [accepted_levels]: list of levels to accept
81+
* - [min_level]: minimum level to accept (only used if accepted_levels not specified)
82+
* - [max_level]: maximum level to accept (only used if accepted_levels not specified)
83+
* - [bubble]: bool, defaults to true
84+
*
7885
* - buffer:
7986
* - handler: the wrapped handler's name
8087
* - [buffer_size]: defaults to 0 (unlimited)
@@ -219,6 +226,7 @@ public function getConfigTreeBuilder()
219226
->fixXmlConfig('member')
220227
->fixXmlConfig('excluded_404')
221228
->fixXmlConfig('tag')
229+
->fixXmlConfig('accepted_level')
222230
->canBeUnset()
223231
->children()
224232
->scalarNode('type')
@@ -245,6 +253,12 @@ public function getConfigTreeBuilder()
245253
->canBeUnset()
246254
->prototype('scalar')->end()
247255
->end()
256+
->arrayNode('accepted_levels') // filter
257+
->canBeUnset()
258+
->prototype('scalar')->end()
259+
->end()
260+
->scalarNode('min_level')->defaultValue('DEBUG')->end() // filter
261+
->scalarNode('max_level')->defaultValue('EMERGENCY')->end() //filter
248262
->scalarNode('buffer_size')->defaultValue(0)->end() // fingers_crossed and buffer
249263
->scalarNode('handler')->end() // fingers_crossed and buffer
250264
->scalarNode('url')->end() // cube
@@ -475,13 +489,21 @@ public function getConfigTreeBuilder()
475489
->thenInvalid('Service handlers can not have a formatter configured in the bundle, you must reconfigure the service itself instead')
476490
->end()
477491
->validate()
478-
->ifTrue(function($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type']) && 1 !== count($v['handler']); })
479-
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler')
492+
->ifTrue(function($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type']) && 1 !== count($v['handler']); })
493+
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler or FilterHandler')
480494
->end()
481495
->validate()
482496
->ifTrue(function($v) { return 'fingers_crossed' === $v['type'] && !empty($v['excluded_404s']) && !empty($v['activation_strategy']); })
483497
->thenInvalid('You can not use excluded_404s together with a custom activation_strategy in a FingersCrossedHandler')
484498
->end()
499+
->validate()
500+
->ifTrue(function($v) { return 'filter' === $v['type'] && "DEBUG" !== $v['min_level'] && !empty($v['accepted_levels']); })
501+
->thenInvalid('You can not use min_level together with accepted_levels in a FilterHandler')
502+
->end()
503+
->validate()
504+
->ifTrue(function($v) { return 'filter' === $v['type'] && "EMERGENCY" !== $v['max_level'] && !empty($v['accepted_levels']); })
505+
->thenInvalid('You can not use max_level together with accepted_levels in a FilterHandler')
506+
->end()
485507
->validate()
486508
->ifTrue(function($v) { return 'swift_mailer' === $v['type'] && empty($v['email_prototype']) && (empty($v['from_email']) || empty($v['to_email']) || empty($v['subject'])); })
487509
->thenInvalid('The sender, recipient and subject or an email prototype have to be specified to use a SwiftMailerHandler')

DependencyInjection/MonologExtension.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ class MonologExtension extends Extension
3131

3232
private $swiftMailerHandlers = array();
3333

34+
private function levelToMonologConst($level)
35+
{
36+
return is_int($level) ? $level : constant('Monolog\Logger::'.strtoupper($level));
37+
}
38+
3439
/**
3540
* Loads the Monolog configuration.
3641
*
@@ -85,6 +90,7 @@ public function load(array $configs, ContainerBuilder $container)
8590
'Monolog\\Handler\\AbstractProcessingHandler',
8691
'Monolog\\Handler\\StreamHandler',
8792
'Monolog\\Handler\\FingersCrossedHandler',
93+
'Monolog\\Handler\\FilterHandler',
8894
'Monolog\\Handler\\TestHandler',
8995
'Monolog\\Logger',
9096
'Symfony\\Bridge\\Monolog\\Logger',
@@ -116,7 +122,7 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
116122
{
117123
$handlerId = $this->getHandlerId($name);
118124
$definition = new Definition(sprintf('%%monolog.handler.%s.class%%', $handler['type']));
119-
$handler['level'] = is_int($handler['level']) ? $handler['level'] : constant('Monolog\Logger::'.strtoupper($handler['level']));
125+
$handler['level'] = $this->levelToMonologConst($handler['level']);
120126

121127
switch ($handler['type']) {
122128
case 'service':
@@ -240,7 +246,7 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
240246
break;
241247

242248
case 'fingers_crossed':
243-
$handler['action_level'] = is_int($handler['action_level']) ? $handler['action_level'] : constant('Monolog\Logger::'.strtoupper($handler['action_level']));
249+
$handler['action_level'] = $this->levelToMonologConst($handler['action_level']);
244250
$nestedHandlerId = $this->getHandlerId($handler['handler']);
245251
$this->nestedHandlers[] = $nestedHandlerId;
246252

@@ -264,6 +270,25 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
264270
));
265271
break;
266272

273+
case 'filter':
274+
$handler['min_level'] = $this->levelToMonologConst($handler['min_level']);
275+
$handler['max_level'] = $this->levelToMonologConst($handler['max_level']);
276+
foreach (array_keys($handler['accepted_levels']) as $k) {
277+
$handler['accepted_levels'][$k] = $this->levelToMonologConst($handler['accepted_levels'][$k]);
278+
}
279+
280+
$nestedHandlerId = $this->getHandlerId($handler['handler']);
281+
$this->nestedHandlers[] = $nestedHandlerId;
282+
$minLevelOrList = !empty($handler['accepted_levels']) ? $handler['accepted_levels'] : $handler['min_level'];
283+
284+
$definition->setArguments(array(
285+
new Reference($nestedHandlerId),
286+
$minLevelOrList,
287+
$handler['max_level'],
288+
$handler['bubble']
289+
));
290+
break;
291+
267292
case 'buffer':
268293
$nestedHandlerId = $this->getHandlerId($handler['handler']);
269294
$this->nestedHandlers[] = $nestedHandlerId;

Resources/config/monolog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
<parameter key="monolog.handler.fingers_crossed.class">Monolog\Handler\FingersCrossedHandler</parameter>
3939
<parameter key="monolog.handler.fingers_crossed.error_level_activation_strategy.class">Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy</parameter>
40+
<parameter key="monolog.handler.filter.class">Monolog\Handler\FilterHandler</parameter>
4041
<parameter key="monolog.handler.mongo.class">Monolog\Handler\MongoDBHandler</parameter>
4142
<parameter key="monolog.mongo.client.class">MongoClient</parameter>
4243

Resources/config/schema/monolog-1.0.xsd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<xsd:element name="mongo" type="mongo" minOccurs="0" maxOccurs="1" />
2323
<xsd:element name="excluded-404" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
2424
<xsd:element name="tag" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
25+
<xsd:element name="accepted-level" type="level" minOccurs="0" maxOccurs="unbounded" />
2526
</xsd:sequence>
2627
<xsd:attribute name="type" type="xsd:string" />
2728
<xsd:attribute name="priority" type="xsd:integer" />
@@ -35,6 +36,8 @@
3536
<xsd:attribute name="host" type="xsd:string" />
3637
<xsd:attribute name="port" type="xsd:integer" />
3738
<xsd:attribute name="action-level" type="level" />
39+
<xsd:attribute name="min-level" type="level" />
40+
<xsd:attribute name="max-level" type="level" />
3841
<xsd:attribute name="buffer-size" type="xsd:integer" />
3942
<xsd:attribute name="max-files" type="xsd:integer" />
4043
<xsd:attribute name="handler" type="xsd:string" />

Tests/DependencyInjection/FixtureMonologExtensionTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ public function testLoadWithSeveralHandlers()
2828
$this->assertTrue($container->hasDefinition('monolog.handler.nested'));
2929

3030
$logger = $container->getDefinition('monolog.logger');
31-
$this->assertCount(2, $logger->getMethodCalls());
32-
$this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
33-
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
31+
$this->assertCount(3, $logger->getMethodCalls());
32+
$this->assertDICDefinitionMethodCallAt(2, $logger, 'pushHandler', array(new Reference('monolog.handler.custom')));
33+
$this->assertDICDefinitionMethodCallAt(1, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
34+
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.filtered')));
3435

3536
$handler = $container->getDefinition('monolog.handler.custom');
3637
$this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
@@ -39,6 +40,10 @@ public function testLoadWithSeveralHandlers()
3940
$handler = $container->getDefinition('monolog.handler.main');
4041
$this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
4142
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, true, true));
43+
44+
$handler = $container->getDefinition('monolog.handler.filtered');
45+
$this->assertDICDefinitionClass($handler, '%monolog.handler.filter.class%');
46+
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested2'), array(\Monolog\Logger::WARNING, \Monolog\Logger::ERROR), \Monolog\Logger::EMERGENCY, true));
4247
}
4348

4449
public function testLoadWithOverwriting()

Tests/DependencyInjection/Fixtures/xml/multiple_handlers.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,10 @@
1010
<handler name="custom" type="stream" path="/tmp/symfony.log" bubble="false" level="ERROR" />
1111
<handler name="main" type="fingers_crossed" action-level="ERROR" handler="nested" />
1212
<handler name="nested" type="stream" />
13+
<handler name="filtered" type="filter" handler="nested2">
14+
<accepted-level>WARNING</accepted-level>
15+
<accepted-level>ERROR</accepted-level>
16+
</handler>
17+
<handler name="nested2" type="stream" />
1318
</config>
1419
</srv:container>

Tests/DependencyInjection/Fixtures/yml/multiple_handlers.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ monolog:
1111
handler: nested
1212
nested:
1313
type: stream
14+
filtered:
15+
type: filter
16+
accepted_levels: [WARNING, ERROR]
17+
handler: nested2
18+
nested2:
19+
type: stream

Tests/DependencyInjection/MonologExtensionTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ public function testExceptionWhenUsingFingerscrossedWithoutHandler()
7070
$loader->load(array(array('handlers' => array('main' => array('type' => 'fingers_crossed')))), $container);
7171
}
7272

73+
/**
74+
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
75+
*/
76+
public function testExceptionWhenUsingFilterWithoutHandler()
77+
{
78+
$container = new ContainerBuilder();
79+
$loader = new MonologExtension();
80+
81+
$loader->load(array(array('handlers' => array('main' => array('type' => 'filter')))), $container);
82+
}
83+
7384
/**
7485
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
7586
*/

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"symfony/dependency-injection": "~2.3",
2222
"symfony/config": "~2.3",
2323
"symfony/http-kernel": "~2.3",
24-
"monolog/monolog": "~1.6"
24+
"monolog/monolog": "~1.8"
2525
},
2626
"require-dev": {
2727
"symfony/yaml": "~2.3",

0 commit comments

Comments
 (0)