Skip to content

Commit a7aba1b

Browse files
committed
Add LogglyHandler support, refs #4
1 parent fc17851 commit a7aba1b

File tree

5 files changed

+86
-1
lines changed

5 files changed

+86
-1
lines changed

DependencyInjection/Configuration.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@
168168
* - [level]: level name or int value, defaults to DEBUG
169169
* - [bubble]: bool, defaults to true
170170
*
171+
* - loggly:
172+
* - token: loggly api token
173+
* - [level]: level name or int value, defaults to DEBUG
174+
* - [bubble]: bool, defaults to true
175+
* - [tags]: tag names
171176
*
172177
* @author Jordi Boggiano <[email protected]>
173178
* @author Christophe Coevoet <[email protected]>
@@ -198,6 +203,7 @@ public function getConfigTreeBuilder()
198203
->prototype('array')
199204
->fixXmlConfig('member')
200205
->fixXmlConfig('excluded_404')
206+
->fixXmlConfig('tag')
201207
->canBeUnset()
202208
->children()
203209
->scalarNode('type')
@@ -232,7 +238,7 @@ public function getConfigTreeBuilder()
232238
->scalarNode('room')->end() // hipchat
233239
->scalarNode('notify')->defaultFalse()->end() // hipchat
234240
->scalarNode('nickname')->defaultValue('Monolog')->end() // hipchat
235-
->scalarNode('token')->end() // pushover & hipchat
241+
->scalarNode('token')->end() // pushover & hipchat & loggly
236242
->variableNode('user') // pushover
237243
->validate()
238244
->ifTrue(function($v) {
@@ -322,6 +328,17 @@ public function getConfigTreeBuilder()
322328
->booleanNode('persistent')->end() // socket_handler
323329
->scalarNode('dsn')->end() // raven_handler
324330
->scalarNode('message_type')->defaultValue(0)->end() // error_log
331+
->arrayNode('tags') // loggly
332+
->beforeNormalization()
333+
->ifString()
334+
->then(function($v) { return explode(',', $v); })
335+
->end()
336+
->beforeNormalization()
337+
->ifArray()
338+
->then(function($v) { return array_filter(array_map('trim', $v)); })
339+
->end()
340+
->prototype('scalar')->end()
341+
->end()
325342
->arrayNode('verbosity_levels') // console
326343
->beforeNormalization()
327344
->ifArray()
@@ -490,6 +507,21 @@ public function getConfigTreeBuilder()
490507
->ifTrue(function($v) { return 'amqp' === $v['type'] && empty($v['exchange']); })
491508
->thenInvalid('The exchange has to be specified to use a AmqpHandler')
492509
->end()
510+
->validate()
511+
->ifTrue(function($v) { return 'loggly' === $v['type'] && empty($v['token']); })
512+
->thenInvalid('The token has to be specified to use a LogglyHandler')
513+
->end()
514+
->validate()
515+
->ifTrue(function($v) { return 'loggly' === $v['type'] && !empty($v['tags']); })
516+
->then(function($v) {
517+
$invalidTags = preg_grep('/^[a-z0-9][a-z0-9\.\-_]*$/i', $v['tags'], PREG_GREP_INVERT);
518+
if (!empty($invalidTags)) {
519+
throw new InvalidConfigurationException(sprintf('The following Loggly tags are invalid: %s.', implode(', ', $invalidTags)));
520+
}
521+
522+
return $v;
523+
})
524+
->end()
493525
->end()
494526
->validate()
495527
->ifTrue(function($v) { return isset($v['debug']); })

DependencyInjection/MonologExtension.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,17 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
409409
));
410410
break;
411411

412+
case 'loggly':
413+
$definition->setArguments(array(
414+
$handler['token'],
415+
$handler['level'],
416+
$handler['bubble'],
417+
));
418+
if (!empty($handler['tags'])) {
419+
$definition->addMethodCall('setTag', array(implode(',', $handler['tags'])));
420+
}
421+
break;
422+
412423
// Handlers using the constructor of AbstractHandler without adding their own arguments
413424
case 'newrelic':
414425
case 'test':

Resources/config/monolog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<parameter key="monolog.handler.cube.class">Monolog\Handler\CubeHandler</parameter>
3030
<parameter key="monolog.handler.amqp.class">Monolog\Handler\AmqpHandler</parameter>
3131
<parameter key="monolog.handler.error_log.class">Monolog\Handler\ErrorLogHandler</parameter>
32+
<parameter key="monolog.handler.loggly.class">Monolog\Handler\LogglyHandler</parameter>
3233
<parameter key="monolog.activation_strategy.not_found.class">Symfony\Bundle\MonologBundle\NotFoundActivationStrategy</parameter>
3334

3435
<parameter key="monolog.handler.fingers_crossed.class">Monolog\Handler\FingersCrossedHandler</parameter>

Resources/config/schema/monolog-1.0.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<xsd:element name="publisher" type="publisher" minOccurs="0" maxOccurs="1" />
2222
<xsd:element name="mongo" type="mongo" minOccurs="0" maxOccurs="1" />
2323
<xsd:element name="excluded-404" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
24+
<xsd:element name="tag" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
2425
</xsd:sequence>
2526
<xsd:attribute name="type" type="xsd:string" />
2627
<xsd:attribute name="priority" type="xsd:integer" />

Tests/DependencyInjection/MonologExtensionTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,46 @@ public function testRavenHandler()
193193
$this->assertDICDefinitionClass($handler, '%monolog.handler.raven.class%');
194194
}
195195

196+
public function testLogglyHandler()
197+
{
198+
$token = '026308d8-2b63-4225-8fe9-e01294b6e472';
199+
try {
200+
$this->getContainer(array(array('handlers' => array('loggly' => array('type' => 'loggly')))));
201+
$this->fail();
202+
} catch (InvalidConfigurationException $e) {
203+
$this->assertContains('token', $e->getMessage());
204+
}
205+
206+
try {
207+
$this->getContainer(array(array('handlers' => array('loggly' => array(
208+
'type' => 'loggly', 'token' => $token, 'tags' => 'x, 1zone ,www.loggly.com,-us,apache$')
209+
))));
210+
$this->fail();
211+
} catch (InvalidConfigurationException $e) {
212+
$this->assertContains('-us, apache$', $e->getMessage());
213+
}
214+
215+
$container = $this->getContainer(array(array('handlers' => array('loggly' => array(
216+
'type' => 'loggly', 'token' => $token)
217+
))));
218+
$this->assertTrue($container->hasDefinition('monolog.logger'));
219+
$this->assertTrue($container->hasDefinition('monolog.handler.loggly'));
220+
221+
$logger = $container->getDefinition('monolog.logger');
222+
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.loggly')));
223+
$handler = $container->getDefinition('monolog.handler.loggly');
224+
$this->assertDICDefinitionClass($handler, '%monolog.handler.loggly.class%');
225+
$this->assertDICConstructorArguments($handler, array($token, \Monolog\Logger::DEBUG, true));
226+
$this->assertEmpty($handler->getMethodCalls());
227+
228+
$container = $this->getContainer(array(array('handlers' => array('loggly' => array(
229+
'type' => 'loggly', 'token' => $token, 'tags' => array(' ', 'foo', '', 'bar'))
230+
))));
231+
$handler = $container->getDefinition('monolog.handler.loggly');
232+
$this->assertDICDefinitionMethodCallAt(0, $handler, 'setTag', array('foo,bar'));
233+
234+
}
235+
196236
protected function getContainer(array $config = array())
197237
{
198238
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)