Skip to content

Commit 30351a4

Browse files
committed
Added support for RollbarHandler
1 parent 4cc1864 commit 30351a4

File tree

5 files changed

+75
-3
lines changed

5 files changed

+75
-3
lines changed

DependencyInjection/Configuration.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,13 @@
208208
* - [level]: level name or int value, defaults to DEBUG
209209
* - [bubble]: bool, defaults to true
210210
*
211+
* - rollbar:
212+
* - id: RollbarNotifier service (mandatory if token is not provided)
213+
* - token: rollbar api token (skip if you provide a RollbarNotifier service id)
214+
* - [config]: config values from https://github.com/rollbar/rollbar-php#configuration-reference
215+
* - [level]: level name or int value, defaults to DEBUG
216+
* - [bubble]: bool, defaults to true
217+
*
211218
* @author Jordi Boggiano <[email protected]>
212219
* @author Christophe Coevoet <[email protected]>
213220
*/
@@ -249,7 +256,7 @@ public function getConfigTreeBuilder()
249256
->then(function ($v) { return strtolower($v); })
250257
->end()
251258
->end()
252-
->scalarNode('id')->end()
259+
->scalarNode('id')->end() // service & rollbar
253260
->scalarNode('priority')->defaultValue(0)->end()
254261
->scalarNode('level')->defaultValue('DEBUG')->end()
255262
->booleanNode('bubble')->defaultTrue()->end()
@@ -280,7 +287,7 @@ public function getConfigTreeBuilder()
280287
->scalarNode('room')->end() // hipchat
281288
->scalarNode('notify')->defaultFalse()->end() // hipchat
282289
->scalarNode('nickname')->defaultValue('Monolog')->end() // hipchat
283-
->scalarNode('token')->end() // pushover & hipchat & loggly & logentries & flowdock
290+
->scalarNode('token')->end() // pushover & hipchat & loggly & logentries & flowdock & rollbar
284291
->scalarNode('source')->end() // flowdock
285292
->booleanNode('use_ssl')->defaultTrue()->end() // logentries
286293
->variableNode('user') // pushover
@@ -341,6 +348,10 @@ public function getConfigTreeBuilder()
341348
->thenInvalid('If you set user, you must provide a password.')
342349
->end()
343350
->end() // mongo
351+
->arrayNode('config')
352+
->canBeUnset()
353+
->prototype('scalar')->end()
354+
->end() // rollbar
344355
->arrayNode('members') // group
345356
->canBeUnset()
346357
->performNoDeepMerging()
@@ -518,6 +529,14 @@ public function getConfigTreeBuilder()
518529
->ifTrue(function ($v) { return 'filter' === $v['type'] && "EMERGENCY" !== $v['max_level'] && !empty($v['accepted_levels']); })
519530
->thenInvalid('You can not use max_level together with accepted_levels in a FilterHandler')
520531
->end()
532+
->validate()
533+
->ifTrue(function ($v) { return 'rollbar' === $v['type'] && !empty($v['id']) && !empty($v['token']); })
534+
->thenInvalid('You can not use both an id and a token in a RollbarHandler')
535+
->end()
536+
->validate()
537+
->ifTrue(function ($v) { return 'rollbar' === $v['type'] && empty($v['id']) && empty($v['token']); })
538+
->thenInvalid('The id or the token has to be specified to use a RollbarHandler')
539+
->end()
521540
->validate()
522541
->ifTrue(function ($v) { return 'swift_mailer' === $v['type'] && empty($v['email_prototype']) && (empty($v['from_email']) || empty($v['to_email']) || empty($v['subject'])); })
523542
->thenInvalid('The sender, recipient and subject or an email prototype have to be specified to use a SwiftMailerHandler')

DependencyInjection/MonologExtension.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,14 +517,35 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
517517
$handler['source'],
518518
$handler['from_email'],
519519
));
520-
$formatterId = uniqid('monolog.flowdock.formatter.');
520+
$formatterId = 'monolog.flowdock.formatter.'.sha1($handler['source'].'|'.$handler['from_email']);
521521
$formatter->setPublic(false);
522522
$container->setDefinition($formatterId, $formatter);
523523

524524
$definition->addMethodCall('setFormatter', array(new Reference($formatterId)));
525525
}
526526
break;
527527

528+
case 'rollbar':
529+
if (!empty($handler['id'])) {
530+
$rollbarId = $handler['id'];
531+
} else {
532+
$config = $handler['config'] ?: array();
533+
$config['access_token'] = $handler['token'];
534+
$rollbar = new Definition("RollbarNotifier", array(
535+
$config,
536+
));
537+
$rollbarId = 'monolog.rollbar.notifier.'.sha1(json_encode($config));
538+
$rollbar->setPublic(false);
539+
$container->setDefinition($rollbarId, $rollbar);
540+
}
541+
542+
$definition->setArguments(array(
543+
new Reference($rollbarId),
544+
$handler['level'],
545+
$handler['bubble'],
546+
));
547+
break;
548+
528549
// Handlers using the constructor of AbstractHandler without adding their own arguments
529550
case 'browser_console':
530551
case 'newrelic':

Resources/config/monolog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<parameter key="monolog.handler.null.class">Monolog\Handler\NullHandler</parameter>
1919
<parameter key="monolog.handler.test.class">Monolog\Handler\TestHandler</parameter>
2020
<parameter key="monolog.handler.gelf.class">Monolog\Handler\GelfHandler</parameter>
21+
<parameter key="monolog.handler.rollbar.class">Monolog\Handler\RollbarHandler</parameter>
2122
<parameter key="monolog.handler.flowdock.class">Monolog\Handler\FlowdockHandler</parameter>
2223
<parameter key="monolog.handler.browser_console.class">Monolog\Handler\BrowserConsoleHandler</parameter>
2324
<parameter key="monolog.handler.firephp.class">Symfony\Bridge\Monolog\Handler\FirePHPHandler</parameter>

Resources/config/schema/monolog-1.0.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<xsd:element name="channels" type="channels" minOccurs="0" maxOccurs="1" />
2121
<xsd:element name="publisher" type="publisher" minOccurs="0" maxOccurs="1" />
2222
<xsd:element name="mongo" type="mongo" minOccurs="0" maxOccurs="1" />
23+
<xsd:element name="config" type="xsd:anyType" minOccurs="0" maxOccurs="1" />
2324
<xsd:element name="excluded-404" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
2425
<xsd:element name="tag" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
2526
<xsd:element name="accepted-level" type="level" minOccurs="0" maxOccurs="unbounded" />

Tests/DependencyInjection/MonologExtensionTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,36 @@ public function testSyslogHandlerWithLogopts()
152152
$this->assertDICConstructorArguments($handler, array(false, 'user', \Monolog\Logger::DEBUG, true, LOG_CONS));
153153
}
154154

155+
public function testRollbarHandlerCreatesNotifier()
156+
{
157+
$container = $this->getContainer(array(array('handlers' => array('main' => array('type' => 'rollbar', 'token' => 'MY_TOKEN')))));
158+
159+
$this->assertTrue($container->hasDefinition('monolog.logger'));
160+
$this->assertTrue($container->hasDefinition('monolog.handler.main'));
161+
162+
$logger = $container->getDefinition('monolog.logger');
163+
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
164+
165+
$handler = $container->getDefinition('monolog.handler.main');
166+
$this->assertDICDefinitionClass($handler, '%monolog.handler.rollbar.class%');
167+
$this->assertDICConstructorArguments($handler, array(new Reference('monolog.rollbar.notifier.1c8e6a67728dff6a209f828427128dd8b3c2b746'), \Monolog\Logger::DEBUG, true));
168+
}
169+
170+
public function testRollbarHandlerReusesNotifier()
171+
{
172+
$container = $this->getContainer(array(array('handlers' => array('main' => array('type' => 'rollbar', 'id' => 'my_rollbar_id')))));
173+
174+
$this->assertTrue($container->hasDefinition('monolog.logger'));
175+
$this->assertTrue($container->hasDefinition('monolog.handler.main'));
176+
177+
$logger = $container->getDefinition('monolog.logger');
178+
$this->assertDICDefinitionMethodCallAt(0, $logger, 'pushHandler', array(new Reference('monolog.handler.main')));
179+
180+
$handler = $container->getDefinition('monolog.handler.main');
181+
$this->assertDICDefinitionClass($handler, '%monolog.handler.rollbar.class%');
182+
$this->assertDICConstructorArguments($handler, array(new Reference('my_rollbar_id'), \Monolog\Logger::DEBUG, true));
183+
}
184+
155185
public function testSocketHandler()
156186
{
157187
try {

0 commit comments

Comments
 (0)