Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@
* - [stop_buffering]: bool to disable buffering once the handler has been activated, defaults to true
* - [bubble]: bool, defaults to true
*
* - filter:
* - handler: the wrapped handler's name
* - [accepted_levels]: list of levels to accept
* - [min_level]: minimum level to accept (only used if accepted_levels not specified)
* - [max_level]: maximum level to accept (only used if accepted_levels not specified)
* - [bubble]: bool, defaults to true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this description isn't very clear I guess

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's present for every handler so no need to specify a long description every time IMO, either you understand what it does in the monolog context or you don't need to care.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right. I didn't notice that it's handle the same with the other handlers.

*
* - buffer:
* - handler: the wrapped handler's name
* - [buffer_size]: defaults to 0 (unlimited)
Expand Down Expand Up @@ -219,6 +226,7 @@ public function getConfigTreeBuilder()
->fixXmlConfig('member')
->fixXmlConfig('excluded_404')
->fixXmlConfig('tag')
->fixXmlConfig('accepted_level')
->canBeUnset()
->children()
->scalarNode('type')
Expand All @@ -245,6 +253,12 @@ public function getConfigTreeBuilder()
->canBeUnset()
->prototype('scalar')->end()
->end()
->arrayNode('accepted_levels') // filter
->canBeUnset()
->prototype('scalar')->end()
->end()
->scalarNode('min_level')->defaultValue('DEBUG')->end() // filter
->scalarNode('max_level')->defaultValue('EMERGENCY')->end() //filter
->scalarNode('buffer_size')->defaultValue(0)->end() // fingers_crossed and buffer
->scalarNode('handler')->end() // fingers_crossed and buffer
->scalarNode('url')->end() // cube
Expand Down Expand Up @@ -475,13 +489,21 @@ public function getConfigTreeBuilder()
->thenInvalid('Service handlers can not have a formatter configured in the bundle, you must reconfigure the service itself instead')
->end()
->validate()
->ifTrue(function($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type']) && 1 !== count($v['handler']); })
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler')
->ifTrue(function($v) { return ('fingers_crossed' === $v['type'] || 'buffer' === $v['type'] || 'filter' === $v['type']) && 1 !== count($v['handler']); })
->thenInvalid('The handler has to be specified to use a FingersCrossedHandler or BufferHandler or FilterHandler')
->end()
->validate()
->ifTrue(function($v) { return 'fingers_crossed' === $v['type'] && !empty($v['excluded_404s']) && !empty($v['activation_strategy']); })
->thenInvalid('You can not use excluded_404s together with a custom activation_strategy in a FingersCrossedHandler')
->end()
->validate()
->ifTrue(function($v) { return 'filter' === $v['type'] && "DEBUG" !== $v['min_level'] && !empty($v['accepted_levels']); })
->thenInvalid('You can not use min_level together with accepted_levels in a FilterHandler')
->end()
->validate()
->ifTrue(function($v) { return 'filter' === $v['type'] && "EMERGENCY" !== $v['max_level'] && !empty($v['accepted_levels']); })
->thenInvalid('You can not use max_level together with accepted_levels in a FilterHandler')
->end()
->validate()
->ifTrue(function($v) { return 'swift_mailer' === $v['type'] && empty($v['email_prototype']) && (empty($v['from_email']) || empty($v['to_email']) || empty($v['subject'])); })
->thenInvalid('The sender, recipient and subject or an email prototype have to be specified to use a SwiftMailerHandler')
Expand Down
29 changes: 27 additions & 2 deletions DependencyInjection/MonologExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ class MonologExtension extends Extension

private $swiftMailerHandlers = array();

private function levelToMonologConst($level)
{
return is_int($level) ? $level : constant('Monolog\Logger::'.strtoupper($level));
}

/**
* Loads the Monolog configuration.
*
Expand Down Expand Up @@ -85,6 +90,7 @@ public function load(array $configs, ContainerBuilder $container)
'Monolog\\Handler\\AbstractProcessingHandler',
'Monolog\\Handler\\StreamHandler',
'Monolog\\Handler\\FingersCrossedHandler',
'Monolog\\Handler\\FilterHandler',
'Monolog\\Handler\\TestHandler',
'Monolog\\Logger',
'Symfony\\Bridge\\Monolog\\Logger',
Expand Down Expand Up @@ -116,7 +122,7 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
{
$handlerId = $this->getHandlerId($name);
$definition = new Definition(sprintf('%%monolog.handler.%s.class%%', $handler['type']));
$handler['level'] = is_int($handler['level']) ? $handler['level'] : constant('Monolog\Logger::'.strtoupper($handler['level']));
$handler['level'] = $this->levelToMonologConst($handler['level']);

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

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

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

case 'filter':
$handler['min_level'] = $this->levelToMonologConst($handler['min_level']);
$handler['max_level'] = $this->levelToMonologConst($handler['max_level']);
foreach (array_keys($handler['accepted_levels']) as $k) {
$handler['accepted_levels'][$k] = $this->levelToMonologConst($handler['accepted_levels'][$k]);
}

$nestedHandlerId = $this->getHandlerId($handler['handler']);
$this->nestedHandlers[] = $nestedHandlerId;
$minLevelOrList = !empty($handler['accepted_levels']) ? $handler['accepted_levels'] : $handler['min_level'];

$definition->setArguments(array(
new Reference($nestedHandlerId),
$minLevelOrList,
$handler['max_level'],
$handler['bubble']
));
break;

case 'buffer':
$nestedHandlerId = $this->getHandlerId($handler['handler']);
$this->nestedHandlers[] = $nestedHandlerId;
Expand Down
1 change: 1 addition & 0 deletions Resources/config/monolog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

<parameter key="monolog.handler.fingers_crossed.class">Monolog\Handler\FingersCrossedHandler</parameter>
<parameter key="monolog.handler.fingers_crossed.error_level_activation_strategy.class">Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy</parameter>
<parameter key="monolog.handler.filter.class">Monolog\Handler\FilterHandler</parameter>
<parameter key="monolog.handler.mongo.class">Monolog\Handler\MongoDBHandler</parameter>
<parameter key="monolog.mongo.client.class">MongoClient</parameter>

Expand Down
3 changes: 3 additions & 0 deletions Resources/config/schema/monolog-1.0.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<xsd:element name="mongo" type="mongo" minOccurs="0" maxOccurs="1" />
<xsd:element name="excluded-404" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="tag" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="accepted-level" type="level" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="priority" type="xsd:integer" />
Expand All @@ -35,6 +36,8 @@
<xsd:attribute name="host" type="xsd:string" />
<xsd:attribute name="port" type="xsd:integer" />
<xsd:attribute name="action-level" type="level" />
<xsd:attribute name="min-level" type="level" />
<xsd:attribute name="max-level" type="level" />
<xsd:attribute name="buffer-size" type="xsd:integer" />
<xsd:attribute name="max-files" type="xsd:integer" />
<xsd:attribute name="handler" type="xsd:string" />
Expand Down
11 changes: 8 additions & 3 deletions Tests/DependencyInjection/FixtureMonologExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ public function testLoadWithSeveralHandlers()
$this->assertTrue($container->hasDefinition('monolog.handler.nested'));

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

$handler = $container->getDefinition('monolog.handler.custom');
$this->assertDICDefinitionClass($handler, '%monolog.handler.stream.class%');
Expand All @@ -39,6 +40,10 @@ public function testLoadWithSeveralHandlers()
$handler = $container->getDefinition('monolog.handler.main');
$this->assertDICDefinitionClass($handler, '%monolog.handler.fingers_crossed.class%');
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested'), \Monolog\Logger::ERROR, 0, true, true));

$handler = $container->getDefinition('monolog.handler.filtered');
$this->assertDICDefinitionClass($handler, '%monolog.handler.filter.class%');
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.handler.nested2'), array(\Monolog\Logger::WARNING, \Monolog\Logger::ERROR), \Monolog\Logger::EMERGENCY, true));
}

public function testLoadWithOverwriting()
Expand Down
5 changes: 5 additions & 0 deletions Tests/DependencyInjection/Fixtures/xml/multiple_handlers.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,10 @@
<handler name="custom" type="stream" path="/tmp/symfony.log" bubble="false" level="ERROR" />
<handler name="main" type="fingers_crossed" action-level="ERROR" handler="nested" />
<handler name="nested" type="stream" />
<handler name="filtered" type="filter" handler="nested2">
<accepted-level>WARNING</accepted-level>
<accepted-level>ERROR</accepted-level>
</handler>
<handler name="nested2" type="stream" />
</config>
</srv:container>
6 changes: 6 additions & 0 deletions Tests/DependencyInjection/Fixtures/yml/multiple_handlers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,9 @@ monolog:
handler: nested
nested:
type: stream
filtered:
type: filter
accepted_levels: [WARNING, ERROR]
handler: nested2
nested2:
type: stream
11 changes: 11 additions & 0 deletions Tests/DependencyInjection/MonologExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,17 @@ public function testExceptionWhenUsingFingerscrossedWithoutHandler()
$loader->load(array(array('handlers' => array('main' => array('type' => 'fingers_crossed')))), $container);
}

/**
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/
public function testExceptionWhenUsingFilterWithoutHandler()
{
$container = new ContainerBuilder();
$loader = new MonologExtension();

$loader->load(array(array('handlers' => array('main' => array('type' => 'filter')))), $container);
}

/**
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"symfony/dependency-injection": "~2.3",
"symfony/config": "~2.3",
"symfony/http-kernel": "~2.3",
"monolog/monolog": "~1.6"
"monolog/monolog": "~1.8"
},
"require-dev": {
"symfony/yaml": "~2.3",
Expand Down