diff --git a/composer.json b/composer.json index bc14c439..b58d8df2 100644 --- a/composer.json +++ b/composer.json @@ -18,14 +18,14 @@ }, "require-dev": { "phpunit/phpunit": "~3.7.0", - "mlehner/gelf-php": "1.0.*", + "graylog2/gelf-php": "~1.0", "raven/raven": "~0.5", "ruflin/elastica": "0.90.*", "doctrine/couchdb": "dev-master", "aws/aws-sdk-php": "~2.4.8" }, "suggest": { - "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "raven/raven": "Allow sending log messages to a Sentry server", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "ruflin/elastica": "Allow sending log messages to an Elastic Search server", diff --git a/src/Monolog/Handler/GelfHandler.php b/src/Monolog/Handler/GelfHandler.php index 34d48e75..d9976677 100644 --- a/src/Monolog/Handler/GelfHandler.php +++ b/src/Monolog/Handler/GelfHandler.php @@ -12,31 +12,44 @@ namespace Monolog\Handler; use Gelf\IMessagePublisher; +use Gelf\PublisherInterface; +use InvalidArgumentException; use Monolog\Logger; -use Monolog\Handler\AbstractProcessingHandler; use Monolog\Formatter\GelfMessageFormatter; /** * Handler to send messages to a Graylog2 (http://www.graylog2.org) server * * @author Matt Lehner + * @author Benjamin Zikarsky */ class GelfHandler extends AbstractProcessingHandler { /** - * @var Gelf\IMessagePublisher the publisher object that sends the message to the server + * @var Publisher the publisher object that sends the message to the server */ protected $publisher; /** - * @param Gelf\IMessagePublisher $publisher a publisher object - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param PublisherInterface|IMessagePublisher $publisher a publisher object + * @param integer $level The minimum logging level at which this handler will be triggered + * @param boolean $bubble Whether the messages that are handled can bubble up the stack or not */ - public function __construct(IMessagePublisher $publisher, $level = Logger::DEBUG, $bubble = true) + public function __construct($publisher, $level = Logger::DEBUG, $bubble = true) { parent::__construct($level, $bubble); + $validPublisher = false; + if (interface_exists('\Gelf\IMessagePublisher') && $publisher instanceof IMessagePublisher) { + $validPublisher = true; + } elseif (interface_exists('\Gelf\PublisherInterface') && $publisher instanceof PublisherInterface) { + $validPublisher = true; + } + + if (!$validPublisher) { + throw new InvalidArgumentException("Invalid publisher"); + } + $this->publisher = $publisher; } diff --git a/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/tests/Monolog/Formatter/GelfMessageFormatterTest.php index d8867d9f..c031d68a 100644 --- a/tests/Monolog/Formatter/GelfMessageFormatterTest.php +++ b/tests/Monolog/Formatter/GelfMessageFormatterTest.php @@ -18,8 +18,8 @@ class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase { public function setUp() { - if (!class_exists("Gelf\Message")) { - $this->markTestSkipped("mlehner/gelf-php not installed"); + if (!class_exists('\Gelf\Message')) { + $this->markTestSkipped("graylog2/gelf-php or mlehner/gelf-php is not installed"); } } @@ -47,7 +47,7 @@ class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase $this->assertEquals('meh', $message->getFacility()); $this->assertEquals(null, $message->getLine()); $this->assertEquals(null, $message->getFile()); - $this->assertEquals(3, $message->getLevel()); + $this->assertEquals($this->isLegacy() ? 3 : 'error', $message->getLevel()); $this->assertNotEmpty($message->getHost()); $formatter = new GelfMessageFormatter('mysystem'); @@ -184,4 +184,9 @@ class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase $this->assertArrayHasKey('_EXTkey', $message_array); $this->assertEquals('pair', $message_array['_EXTkey']); } + + private function isLegacy() + { + return interface_exists('\Gelf\IMessagePublisher'); + } } diff --git a/tests/Monolog/Handler/GelfHandlerLegacyTest.php b/tests/Monolog/Handler/GelfHandlerLegacyTest.php new file mode 100644 index 00000000..1bd36f23 --- /dev/null +++ b/tests/Monolog/Handler/GelfHandlerLegacyTest.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Gelf\Message; +use Monolog\TestCase; +use Monolog\Logger; +use Monolog\Formatter\GelfMessageFormatter; + +class GelfHandlerLegacyTest extends TestCase +{ + public function setUp() + { + if (!class_exists('\Gelf\MessagePublisher') || !class_exists('\Gelf\Message')) { + $this->markTestSkipped("mlehner/gelf-php not installed"); + } + + require_once __DIR__ . '/GelfMocks.php'; + } + + /** + * @covers Monolog\Handler\GelfHandler::__construct + */ + public function testConstruct() + { + $handler = new GelfHandler($this->getMessagePublisher()); + $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); + } + + protected function getHandler($messagePublisher) + { + $handler = new GelfHandler($messagePublisher); + + return $handler; + } + + protected function getMessagePublisher() + { + return new MockMessagePublisher('localhost'); + } + + public function testDebug() + { + $messagePublisher = $this->getMessagePublisher(); + $handler = $this->getHandler($messagePublisher); + + $record = $this->getRecord(Logger::DEBUG, "A test debug message"); + $handler->handle($record); + + $this->assertEquals(7, $messagePublisher->lastMessage->getLevel()); + $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); + $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); + $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); + } + + public function testWarning() + { + $messagePublisher = $this->getMessagePublisher(); + $handler = $this->getHandler($messagePublisher); + + $record = $this->getRecord(Logger::WARNING, "A test warning message"); + $handler->handle($record); + + $this->assertEquals(4, $messagePublisher->lastMessage->getLevel()); + $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); + $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); + $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); + } + + public function testInjectedGelfMessageFormatter() + { + $messagePublisher = $this->getMessagePublisher(); + $handler = $this->getHandler($messagePublisher); + + $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); + + $record = $this->getRecord(Logger::WARNING, "A test warning message"); + $record['extra']['blarg'] = 'yep'; + $record['context']['from'] = 'logger'; + $handler->handle($record); + + $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost()); + $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray()); + $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray()); + } +} diff --git a/tests/Monolog/Handler/GelfHandlerTest.php b/tests/Monolog/Handler/GelfHandlerTest.php index 8e9b9f8a..a14a1a9d 100644 --- a/tests/Monolog/Handler/GelfHandlerTest.php +++ b/tests/Monolog/Handler/GelfHandlerTest.php @@ -11,6 +11,7 @@ namespace Monolog\Handler; +use Gelf\Message; use Monolog\TestCase; use Monolog\Logger; use Monolog\Formatter\GelfMessageFormatter; @@ -19,11 +20,9 @@ class GelfHandlerTest extends TestCase { public function setUp() { - if (!class_exists("Gelf\MessagePublisher") || !class_exists("Gelf\Message")) { - $this->markTestSkipped("mlehner/gelf-php not installed"); + if (!class_exists('\Gelf\Publisher') || !class_exists('\Gelf\Message')) { + $this->markTestSkipped("graylog2/gelf-php not installed"); } - - require_once __DIR__ . '/GelfMocks.php'; } /** @@ -44,51 +43,79 @@ class GelfHandlerTest extends TestCase protected function getMessagePublisher() { - return new MockMessagePublisher('localhost'); + return $this->getMock('\Gelf\Publisher', array('publish'), array(), '', false); } public function testDebug() { + $record = $this->getRecord(Logger::DEBUG, "A test debug message"); + $expectedMessage = new Message(); + $expectedMessage + ->setLevel(7) + ->setFacility("test") + ->setShortMessage($record['message']) + ->setTimestamp($record['datetime']) + ; + $messagePublisher = $this->getMessagePublisher(); + $messagePublisher->expects($this->once()) + ->method('publish') + ->with($expectedMessage); + $handler = $this->getHandler($messagePublisher); - $record = $this->getRecord(Logger::DEBUG, "A test debug message"); + $handler->handle($record); - $this->assertEquals(7, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); } public function testWarning() { + $record = $this->getRecord(Logger::WARNING, "A test warning message"); + $expectedMessage = new Message(); + $expectedMessage + ->setLevel(4) + ->setFacility("test") + ->setShortMessage($record['message']) + ->setTimestamp($record['datetime']) + ; + $messagePublisher = $this->getMessagePublisher(); + $messagePublisher->expects($this->once()) + ->method('publish') + ->with($expectedMessage); + $handler = $this->getHandler($messagePublisher); - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $handler->handle($record); - $this->assertEquals(4, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); + $handler->handle($record); } public function testInjectedGelfMessageFormatter() { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); - $record = $this->getRecord(Logger::WARNING, "A test warning message"); $record['extra']['blarg'] = 'yep'; $record['context']['from'] = 'logger'; + + $expectedMessage = new Message(); + $expectedMessage + ->setLevel(4) + ->setFacility("test") + ->setHost("mysystem") + ->setShortMessage($record['message']) + ->setTimestamp($record['datetime']) + ->setAdditional("EXTblarg", 'yep') + ->setAdditional("CTXfrom", 'logger') + ; + + $messagePublisher = $this->getMessagePublisher(); + $messagePublisher->expects($this->once()) + ->method('publish') + ->with($expectedMessage); + + $handler = $this->getHandler($messagePublisher); + $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); $handler->handle($record); - $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost()); - $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray()); - $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray()); } }