diff --git a/src/Monolog/Handler/NewRelicHandler.php b/src/Monolog/Handler/NewRelicHandler.php index 07869cee..757baa83 100644 --- a/src/Monolog/Handler/NewRelicHandler.php +++ b/src/Monolog/Handler/NewRelicHandler.php @@ -21,11 +21,22 @@ use Monolog\Logger; class NewRelicHandler extends AbstractProcessingHandler { /** - * {@inheritDoc} + * Name of the New Relic application that will receive logs from this handler. + * + * @var string */ - public function __construct($level = Logger::ERROR, $bubble = true) + protected $appName; + + /** + * {@inheritDoc} + * + * @param string $appName + */ + public function __construct($level = Logger::ERROR, $bubble = true, $appName = null) { parent::__construct($level, $bubble); + + $this->appName = $appName; } /** @@ -37,8 +48,8 @@ class NewRelicHandler extends AbstractProcessingHandler throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); } - if (isset($record['context']['appname'])) { - newrelic_set_appname($record['context']['appname']); + if ($appName = $this->getAppName($record['context'])) { + $this->setNewRelicAppName($appName); } if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { @@ -62,4 +73,30 @@ class NewRelicHandler extends AbstractProcessingHandler { return extension_loaded('newrelic'); } + + /** + * Returns the appname where this log should be sent. Each log can override the default appname, set in this + * handler's constructor, by providing the appname in its context. + * + * @param array $context + * @return null|string + */ + protected function getAppName(array $context) + { + if (isset($context['appname'])) { + return $context['appname']; + } + + return $this->appName; + } + + /** + * Sets the NewRelic application that should receive this log. + * + * @param string $appName + */ + protected function setNewRelicAppName($appName) + { + newrelic_set_appname($appName); + } } diff --git a/tests/Monolog/Handler/NewRelicHandlerTest.php b/tests/Monolog/Handler/NewRelicHandlerTest.php index ab3ba97d..1e2caa91 100644 --- a/tests/Monolog/Handler/NewRelicHandlerTest.php +++ b/tests/Monolog/Handler/NewRelicHandlerTest.php @@ -13,9 +13,17 @@ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; +use Psr\Log\LogLevel; class NewRelicHandlerTest extends TestCase { + public static $appname; + + public function setUp() + { + $this::$appname = null; + } + /** * @expectedException Monolog\Handler\MissingExtensionException */ @@ -42,6 +50,30 @@ class NewRelicHandlerTest extends TestCase $handler = new StubNewRelicHandler(); $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'myApp'))); } + + public function testTheAppNameIsNullByDefault() + { + $handler = new StubNewRelicHandler(); + $handler->handle($this->getRecord(Logger::ERROR, 'log message')); + + $this->assertEquals(null, $this::$appname); + } + + public function testTheAppNameCanBeInjectedFromtheConstructor() + { + $handler = new StubNewRelicHandler(LogLevel::ALERT, false, 'myAppName'); + $handler->handle($this->getRecord(Logger::ERROR, 'log message')); + + $this->assertEquals('myAppName', $this::$appname); + } + + public function testTheAppNameCanBeOverriddenFromEachLog() + { + $handler = new StubNewRelicHandler(LogLevel::ALERT, false, 'myAppName'); + $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName'))); + + $this->assertEquals('logAppName', $this::$appname); + } } class StubNewRelicHandlerWithoutExtension extends NewRelicHandler @@ -65,9 +97,9 @@ function newrelic_notice_error() return true; } -function newrelic_set_appname() +function newrelic_set_appname($appname) { - return true; + return NewRelicHandlerTest::$appname = $appname; } function newrelic_add_custom_parameter()