Browse Source

the appname can now be set from the handler's constructor

odino 12 năm trước cách đây
mục cha
commit
165778963e

+ 40 - 3
src/Monolog/Handler/NewRelicHandler.php

@@ -20,12 +20,23 @@ use Monolog\Logger;
  */
 class NewRelicHandler extends AbstractProcessingHandler
 {
+    /**
+     * Name of the New Relic application that will receive logs from this handler.
+     *
+     * @var string
+     */
+    protected $appName;
+
     /**
      * {@inheritDoc}
+     *
+     * @param string $appName
      */
-    public function __construct($level = Logger::ERROR, $bubble = true)
+    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);
+    }
 }

+ 34 - 2
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()