Skip to content

Commit

Permalink
Add LogglyHandler support, refs symfony#4
Browse files Browse the repository at this point in the history
  • Loading branch information
hason committed Dec 26, 2013
1 parent fc17851 commit a7aba1b
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 1 deletion.
34 changes: 33 additions & 1 deletion DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@
* - [level]: level name or int value, defaults to DEBUG
* - [bubble]: bool, defaults to true
*
* - loggly:
* - token: loggly api token
* - [level]: level name or int value, defaults to DEBUG
* - [bubble]: bool, defaults to true
* - [tags]: tag names
*
* @author Jordi Boggiano <j.boggiano@seld.be>
* @author Christophe Coevoet <stof@notk.org>
Expand Down Expand Up @@ -198,6 +203,7 @@ public function getConfigTreeBuilder()
->prototype('array')
->fixXmlConfig('member')
->fixXmlConfig('excluded_404')
->fixXmlConfig('tag')
->canBeUnset()
->children()
->scalarNode('type')
Expand Down Expand Up @@ -232,7 +238,7 @@ public function getConfigTreeBuilder()
->scalarNode('room')->end() // hipchat
->scalarNode('notify')->defaultFalse()->end() // hipchat
->scalarNode('nickname')->defaultValue('Monolog')->end() // hipchat
->scalarNode('token')->end() // pushover & hipchat
->scalarNode('token')->end() // pushover & hipchat & loggly
->variableNode('user') // pushover
->validate()
->ifTrue(function($v) {
Expand Down Expand Up @@ -322,6 +328,17 @@ public function getConfigTreeBuilder()
->booleanNode('persistent')->end() // socket_handler
->scalarNode('dsn')->end() // raven_handler
->scalarNode('message_type')->defaultValue(0)->end() // error_log
->arrayNode('tags') // loggly
->beforeNormalization()
->ifString()
->then(function($v) { return explode(',', $v); })
->end()
->beforeNormalization()
->ifArray()
->then(function($v) { return array_filter(array_map('trim', $v)); })
->end()
->prototype('scalar')->end()
->end()
->arrayNode('verbosity_levels') // console
->beforeNormalization()
->ifArray()
Expand Down Expand Up @@ -490,6 +507,21 @@ public function getConfigTreeBuilder()
->ifTrue(function($v) { return 'amqp' === $v['type'] && empty($v['exchange']); })
->thenInvalid('The exchange has to be specified to use a AmqpHandler')
->end()
->validate()
->ifTrue(function($v) { return 'loggly' === $v['type'] && empty($v['token']); })
->thenInvalid('The token has to be specified to use a LogglyHandler')
->end()
->validate()
->ifTrue(function($v) { return 'loggly' === $v['type'] && !empty($v['tags']); })
->then(function($v) {
$invalidTags = preg_grep('/^[a-z0-9][a-z0-9\.\-_]*$/i', $v['tags'], PREG_GREP_INVERT);
if (!empty($invalidTags)) {
throw new InvalidConfigurationException(sprintf('The following Loggly tags are invalid: %s.', implode(', ', $invalidTags)));
}

return $v;
})
->end()
->end()
->validate()
->ifTrue(function($v) { return isset($v['debug']); })
Expand Down
11 changes: 11 additions & 0 deletions DependencyInjection/MonologExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,17 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
));
break;

case 'loggly':
$definition->setArguments(array(
$handler['token'],
$handler['level'],
$handler['bubble'],
));
if (!empty($handler['tags'])) {
$definition->addMethodCall('setTag', array(implode(',', $handler['tags'])));
}
break;

// Handlers using the constructor of AbstractHandler without adding their own arguments
case 'newrelic':
case 'test':
Expand Down
1 change: 1 addition & 0 deletions Resources/config/monolog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
<parameter key="monolog.handler.cube.class">Monolog\Handler\CubeHandler</parameter>
<parameter key="monolog.handler.amqp.class">Monolog\Handler\AmqpHandler</parameter>
<parameter key="monolog.handler.error_log.class">Monolog\Handler\ErrorLogHandler</parameter>
<parameter key="monolog.handler.loggly.class">Monolog\Handler\LogglyHandler</parameter>
<parameter key="monolog.activation_strategy.not_found.class">Symfony\Bundle\MonologBundle\NotFoundActivationStrategy</parameter>

<parameter key="monolog.handler.fingers_crossed.class">Monolog\Handler\FingersCrossedHandler</parameter>
Expand Down
1 change: 1 addition & 0 deletions Resources/config/schema/monolog-1.0.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<xsd:element name="publisher" type="publisher" minOccurs="0" maxOccurs="1" />
<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:sequence>
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="priority" type="xsd:integer" />
Expand Down
40 changes: 40 additions & 0 deletions Tests/DependencyInjection/MonologExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,46 @@ public function testRavenHandler()
$this->assertDICDefinitionClass($handler, '%monolog.handler.raven.class%');
}

public function testLogglyHandler()
{
$token = '026308d8-2b63-4225-8fe9-e01294b6e472';
try {
$this->getContainer(array(array('handlers' => array('loggly' => array('type' => 'loggly')))));
$this->fail();
} catch (InvalidConfigurationException $e) {
$this->assertContains('token', $e->getMessage());
}

try {
$this->getContainer(array(array('handlers' => array('loggly' => array(
'type' => 'loggly', 'token' => $token, 'tags' => 'x, 1zone ,www.loggly.com,-us,apache$')
))));
$this->fail();
} catch (InvalidConfigurationException $e) {
$this->assertContains('-us, apache$', $e->getMessage());
}

$container = $this->getContainer(array(array('handlers' => array('loggly' => array(
'type' => 'loggly', 'token' => $token)
))));
$this->assertTrue($container->hasDefinition('monolog.logger'));
$this->assertTrue($container->hasDefinition('monolog.handler.loggly'));

$logger = $container->getDefinition('monolog.logger');
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.loggly')));
$handler = $container->getDefinition('monolog.handler.loggly');
$this->assertDICDefinitionClass($handler, '%monolog.handler.loggly.class%');
$this->assertDICConstructorArguments($handler, array($token, \Monolog\Logger::DEBUG, true));
$this->assertEmpty($handler->getMethodCalls());

$container = $this->getContainer(array(array('handlers' => array('loggly' => array(
'type' => 'loggly', 'token' => $token, 'tags' => array(' ', 'foo', '', 'bar'))
))));
$handler = $container->getDefinition('monolog.handler.loggly');
$this->assertDICDefinitionMethodCallAt(0, $handler, 'setTag', array('foo,bar'));

}

protected function getContainer(array $config = array())
{
$container = new ContainerBuilder();
Expand Down

0 comments on commit a7aba1b

Please sign in to comment.