diff --git a/src/Monolog/Handler/AmqpHandler.php b/src/Monolog/Handler/AmqpHandler.php index a3f95244..64ef53b3 100644 --- a/src/Monolog/Handler/AmqpHandler.php +++ b/src/Monolog/Handler/AmqpHandler.php @@ -16,24 +16,33 @@ use Monolog\Formatter\JsonFormatter; class AmqpHandler extends AbstractProcessingHandler { - /** @var \AMQPExchange $exchange */ + /** + * @var \AMQPExchange $exchange + */ protected $exchange; - /** @var string $space */ - protected $space; /** - * @param \AMQPConnection $amqp AMQP connection, ready for use + * Describes current issuer (e.g. "database", "landing", "server" and so on) + * @var string $issuer + */ + protected $issuer; + + /** + * @param \AMQPExchange $exchange AMQP exchange, ready for use * @param string $exchangeName - * @param string $space string to be able better manage routing keys + * @param string $issuer isser name * @param int $level * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ - function __construct(\AMQPConnection $amqp, $exchangeName = 'log', $space = '', $level = Logger::DEBUG, $bubble = true) + public function __construct($exchange, $exchangeName = 'log', $issuer = 'default', $level = Logger::DEBUG, $bubble = true) { - $this->space = $space; - $channel = new \AMQPChannel($amqp); - $this->exchange = new \AMQPExchange($channel); + if (!$exchange instanceof \AMQPExchange) { + throw new \LogicException('AMQP handler requires a valid exchange to be provided'); + } + + $this->exchange = $exchange; $this->exchange->setName($exchangeName); + parent::__construct($level, $bubble); } @@ -46,9 +55,19 @@ class AmqpHandler extends AbstractProcessingHandler protected function write(array $record) { $data = $record["formatted"]; - $routingKey = substr(strtolower($record['level_name']),0,4 ).'.'.$this->space; - $this->exchange->publish($data, $routingKey, 0, - array('delivery_mode' => 2, 'Content-type' => 'application/json')); + + $routingKey = sprintf('%s.%s', + substr($record['level_name'], 0, 4), + $this->getIssuer()); + + //we do not check return value because no handler really does + $this->exchange->publish($data, + strtolower($routingKey), + 0, + array( + 'delivery_mode' => 2, + 'Content-type' => 'application/json' + )); } /** @@ -58,4 +77,22 @@ class AmqpHandler extends AbstractProcessingHandler { return new JsonFormatter(); } + + /** + * Issuer setter + * @param string $issuer + */ + public function setIssuer($issuer) + { + $this->issuer = $issuer; + } + + /** + * Issuer getter + * @return string + */ + public function getIssuer() + { + return $this->issuer; + } } diff --git a/tests/Monolog/Handler/AmqpHandlerTest.php b/tests/Monolog/Handler/AmqpHandlerTest.php index 751ce4f0..7f9646b5 100644 --- a/tests/Monolog/Handler/AmqpHandlerTest.php +++ b/tests/Monolog/Handler/AmqpHandlerTest.php @@ -28,31 +28,56 @@ class AmqpHandlerTest extends TestCase if (!class_exists('AMQPChannel')) { throw new \Exception(' Please update AMQP to version >= 1'); } - - require_once __DIR__ . '/AmqpMocks.php'; } - - public function testConstruct() + /** + * @covers Monolog\Handler\AmqpHandler::__construct + * @covers Monolog\Handler\AmqpHandler::handle + * @covers Monolog\Handler\AmqpHandler::write + * @covers Monolog\Handler\AmqpHandler::getDefaultFormatter + */ + public function testHandle() { -// $handler = new AmqpHandler($this->getMockAMQPConnection(), 'log', 'monolog'); -// $this->assertInstanceOf('Monolog\Handler\AmqpHandler', $handler); + $exchange = $this->getExchange(); + + $handler = new AmqpHandler($exchange, 'log', 'test'); + + $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); + + $handler->handle($record); } - public function testWrite() + protected function getExchange() { + /* sorry, but PHP bug in zend_object_store_get_object segfaults + php where using mocks on AMQP classes. should be fixed someday, + but now it's time for some shitcode (see below) + $exchange = $this->getMockBuilder('\AMQPExchange') + ->setConstructorArgs(array($this->getMock('\AMQPChannel'))) + ->setMethods(array('setName')) + ->getMock(); + $exchange->expects($this->any()) + ->method('setName') + ->will($this->returnValue(true)); + */ + return new MockAMQPExchange(); + } +} + +class MockAMQPExchange extends \AMQPExchange +{ + public function __construct() + { } - public function getMockAMQPConnection() + public function publish($message, $routing_key, $params = 0, $attributes = array()) { - return new MockAMQPConnection(); + return true; } - public function tearDown() + public function setName($name) { - foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) { - unlink($file); - } + return true; } } \ No newline at end of file diff --git a/tests/Monolog/Handler/AmqpMocks.php b/tests/Monolog/Handler/AmqpMocks.php deleted file mode 100644 index cdbb8a8a..00000000 --- a/tests/Monolog/Handler/AmqpMocks.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -class MockAMQPConnection extends \AMQPConnection -{ - public function __construct(){ - - } - - public function pconnect() - { - return true; - } - - public function reconnect() - { - return false; - } - - public function connect() { - return true; - } - - public function isConnected() { - return true; - } -} - - -class MockAMQPChannel extends \AMQPChannel -{ - public function __construct(MockAMQPConnection $connection) { - - } -} - -class MockAMQPExchange extends \AMQPExchange -{ - - public function __construct(MockAMQPChannel $channel) { - - } - - public function publish($message, $routing_key, $flags, $headers){ - return; - } - - public function setName($exchangeName) { - return true; - } -} \ No newline at end of file