From acbf574b98fcc34f3bd0287cf22b4a8f2648d8f8 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Tue, 24 Apr 2012 17:20:13 -0700 Subject: [PATCH 01/17] Add RavenHandler and RavenFormatter for working with Raven which is the protocol used by Sentry (http://github.com/dcramer/sentry). Uses raven-php (https://github.com/getsentry/raven-php). --- composer.json | 2 + src/Monolog/Formatter/RavenFormatter.php | 51 ++++++++++ src/Monolog/Handler/RavenHandler.php | 77 +++++++++++++++ tests/Monolog/Handler/RavenHandlerTest.php | 107 +++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 src/Monolog/Formatter/RavenFormatter.php create mode 100644 src/Monolog/Handler/RavenHandler.php create mode 100644 tests/Monolog/Handler/RavenHandlerTest.php diff --git a/composer.json b/composer.json index c8c28b04..c78f0456 100644 --- a/composer.json +++ b/composer.json @@ -16,9 +16,11 @@ "php": ">=5.3.0" }, "require-dev": { + "raven/raven": ">=0.2.0", "mlehner/gelf-php": "1.0.*" }, "suggest": { + "raven/raven": "Allow sending log messages to a Sentry server", "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server" }, "autoload": { diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php new file mode 100644 index 00000000..d7eb917d --- /dev/null +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use \Raven_Client; + +/** + * Serializes a log message for Raven (https://github.com/getsentry/raven-php) + * + * @author Marc Abramowitz + */ +class RavenFormatter extends NormalizerFormatter +{ + /** + * Translates Monolog log levels to Raven log levels. + */ + private $logLevels = array( + Logger::DEBUG => Raven_Client::DEBUG, + Logger::INFO => Raven_Client::INFO, + Logger::WARNING => Raven_Client::WARNING, + Logger::ERROR => Raven_Client::ERROR, + ); + + /** + * {@inheritdoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + $record['level'] = $this->logLevels[$record['level']]; + $record['message'] = $record['channel'] . ': ' . $record['message']; + + if (isset($record['context']['context'])) + { + $record['context'] = $record['context']['context']; + } + + return $record; + } +} diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php new file mode 100644 index 00000000..8faa1b86 --- /dev/null +++ b/src/Monolog/Handler/RavenHandler.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Handler\AbstractProcessingHandler; +use Monolog\Formatter\RavenFormatter; +use \Raven_Client; + +/** + * Handler to send messages to a Sentry (https://github.com/dcramer/sentry) server + * using raven-php (https://github.com/getsentry/raven-php) + * + * @author Marc Abramowitz + */ +class RavenHandler extends AbstractProcessingHandler +{ + /** + * @var Raven_Client the client object that sends the message to the server + */ + protected $ravenClient; + + /** + * @param Raven_Client $ravenClient + * @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(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) + { + parent::__construct($level, $bubble); + + $this->ravenClient = $ravenClient; + } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->ravenClient = null; + } + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + if ($record['level'] == Logger::ERROR) + { + $this->ravenClient->captureException($record['context']['context']); + } + else + { + $this->ravenClient->captureMessage( + $record['formatted']['message'], $params = $record, + $record['formatted']['level'], $stack = true + ); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter() + { + return new RavenFormatter(); + } +} diff --git a/tests/Monolog/Handler/RavenHandlerTest.php b/tests/Monolog/Handler/RavenHandlerTest.php new file mode 100644 index 00000000..e6040f28 --- /dev/null +++ b/tests/Monolog/Handler/RavenHandlerTest.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\TestCase; +use Monolog\Logger; +use Monolog\Handler\RavenHandler; +use \Raven_Client; + +class MockRavenClient extends Raven_Client +{ + public function capture($data, $stack) + { + $this->lastData = $data; + $this->lastStack = $stack; + } + + public $lastData; + public $lastStack; +} + +class RavenHandlerTest extends TestCase +{ + public function setUp() + { + if (!class_exists("Raven_Client")) { + $this->markTestSkipped("raven/raven not installed"); + } + } + + /** + * @covers Monolog\Handler\RavenHandler::__construct + */ + public function testConstruct() + { + $handler = new RavenHandler($this->getRavenClient()); + $this->assertInstanceOf('Monolog\Handler\RavenHandler', $handler); + } + + protected function getHandler($ravenClient) + { + $handler = new RavenHandler($ravenClient); + return $handler; + } + + protected function getRavenClient() + { + $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1'; + return new MockRavenClient($dsn); + } + + public function testDebug() + { + $ravenClient = $this->getRavenClient(); + $handler = $this->getHandler($ravenClient); + + $record = $this->getRecord(Logger::DEBUG, "A test debug message"); + $handler->handle($record); + + $this->assertEquals(Raven_Client::DEBUG, $ravenClient->lastData['level']); + $this->assertContains($record['message'], $ravenClient->lastData['message']); + } + + public function testWarning() + { + $ravenClient = $this->getRavenClient(); + $handler = $this->getHandler($ravenClient); + + $record = $this->getRecord(Logger::WARNING, "A test warning message"); + $handler->handle($record); + + $this->assertEquals(Raven_Client::WARNING, $ravenClient->lastData['level']); + $this->assertContains($record['message'], $ravenClient->lastData['message']); + } + + public function testException() + { + $ravenClient = $this->getRavenClient(); + $handler = $this->getHandler($ravenClient); + + try + { + $this->methodThatThrowsAnException(); + } + catch (\Exception $e) + { + $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('context' => $e)); + $handler->handle($record); + } + + $this->assertEquals($record['message'], $ravenClient->lastData['message']); + } + + private function methodThatThrowsAnException() + { + throw new \Exception('This is an exception'); + } +} From 8aeb75a210edc4e1ed0e136e191775dbf2825f74 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:01:12 -0700 Subject: [PATCH 02/17] composer.json: Tighten requirement "raven/raven": ">=0.2.0" to "raven/raven": "0.2.*" as suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737288 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c78f0456..0db33e57 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "php": ">=5.3.0" }, "require-dev": { - "raven/raven": ">=0.2.0", + "raven/raven": "0.2.*", "mlehner/gelf-php": "1.0.*" }, "suggest": { From ac161a0caabed15d005c15bf0afe689fc20839d5 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:05:29 -0700 Subject: [PATCH 03/17] Remove leading \ in use statement, as suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737290 --- src/Monolog/Formatter/RavenFormatter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php index d7eb917d..d01a5256 100644 --- a/src/Monolog/Formatter/RavenFormatter.php +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -12,7 +12,7 @@ namespace Monolog\Formatter; use Monolog\Logger; -use \Raven_Client; +use Raven_Client; /** * Serializes a log message for Raven (https://github.com/getsentry/raven-php) From 0e579f1878226ddab2634f6b6e0018cc43c6e7c5 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:08:00 -0700 Subject: [PATCH 04/17] Map CRITICAL and ALERT to ERROR because raven doesn't have more than ERROR, because otherwise those messages will fail. As suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737292 --- src/Monolog/Formatter/RavenFormatter.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php index d01a5256..fa2cbb7b 100644 --- a/src/Monolog/Formatter/RavenFormatter.php +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -29,6 +29,8 @@ class RavenFormatter extends NormalizerFormatter Logger::INFO => Raven_Client::INFO, Logger::WARNING => Raven_Client::WARNING, Logger::ERROR => Raven_Client::ERROR, + Logger::CRITICAL => Raven_Client::ERROR, + Logger::ALERT => Raven_Client::ERROR, ); /** From f1580092bc817f5c96b84990d1189bc89ef1d449 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:09:58 -0700 Subject: [PATCH 05/17] Minor reformatting suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737297 --- src/Monolog/Formatter/RavenFormatter.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php index fa2cbb7b..8da490c0 100644 --- a/src/Monolog/Formatter/RavenFormatter.php +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -43,8 +43,7 @@ class RavenFormatter extends NormalizerFormatter $record['level'] = $this->logLevels[$record['level']]; $record['message'] = $record['channel'] . ': ' . $record['message']; - if (isset($record['context']['context'])) - { + if (isset($record['context']['context'])) { $record['context'] = $record['context']['context']; } From 6d158110d509414ff7438d96ada6c8221598e974 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:14:03 -0700 Subject: [PATCH 06/17] Put braces on same line for if statements, as requested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737303 --- src/Monolog/Handler/RavenHandler.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 8faa1b86..2789805f 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -54,12 +54,9 @@ class RavenHandler extends AbstractProcessingHandler */ protected function write(array $record) { - if ($record['level'] == Logger::ERROR) - { + if ($record['level'] == Logger::ERROR) { $this->ravenClient->captureException($record['context']['context']); - } - else - { + } else { $this->ravenClient->captureMessage( $record['formatted']['message'], $params = $record, $record['formatted']['level'], $stack = true From f6e75e44cb07f5733d4aebd6bdf35bff5ffebe16 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:16:25 -0700 Subject: [PATCH 07/17] Put args one per line, as suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737313 --- src/Monolog/Handler/RavenHandler.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 2789805f..0c38d71a 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -58,8 +58,10 @@ class RavenHandler extends AbstractProcessingHandler $this->ravenClient->captureException($record['context']['context']); } else { $this->ravenClient->captureMessage( - $record['formatted']['message'], $params = $record, - $record['formatted']['level'], $stack = true + $record['formatted']['message'], + $params = $record, + $level = $record['formatted']['level'], + $stack = true ); } } From 3238a7417b26d32567562ea7da997c2b3f0cd12f Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 11:39:21 -0700 Subject: [PATCH 08/17] Rework how exceptions are stored and accessed using suggestions from @Seldaek in https://github.com/Seldaek/monolog/pull/76/files#r737312 --- src/Monolog/Formatter/RavenFormatter.php | 4 ---- src/Monolog/Handler/RavenHandler.php | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php index 8da490c0..7fdc40f3 100644 --- a/src/Monolog/Formatter/RavenFormatter.php +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -43,10 +43,6 @@ class RavenFormatter extends NormalizerFormatter $record['level'] = $this->logLevels[$record['level']]; $record['message'] = $record['channel'] . ': ' . $record['message']; - if (isset($record['context']['context'])) { - $record['context'] = $record['context']['context']; - } - return $record; } } diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 0c38d71a..94fc4242 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -54,8 +54,8 @@ class RavenHandler extends AbstractProcessingHandler */ protected function write(array $record) { - if ($record['level'] == Logger::ERROR) { - $this->ravenClient->captureException($record['context']['context']); + if ($record['level'] == Logger::ERROR && isset($record['context']['exception'])) { + $this->ravenClient->captureException($record['context']['exception']); } else { $this->ravenClient->captureMessage( $record['formatted']['message'], From 1c5969629f3df359ca7241ff2b4459081d22eabf Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 14:07:43 -0700 Subject: [PATCH 09/17] Change check of record level to >= Logger::ERROR instead of > Logger::ERROR, as suggested by @Seldaek in https://github.com/Seldaek/monolog/pull/76#r737303 --- src/Monolog/Handler/RavenHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 94fc4242..ec3c294d 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -54,7 +54,7 @@ class RavenHandler extends AbstractProcessingHandler */ protected function write(array $record) { - if ($record['level'] == Logger::ERROR && isset($record['context']['exception'])) { + if ($record['level'] >= Logger::ERROR && isset($record['context']['exception'])) { $this->ravenClient->captureException($record['context']['exception']); } else { $this->ravenClient->captureMessage( From 7a81acd28b8a08313abbdebd7dafd9543385e439 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 14:16:41 -0700 Subject: [PATCH 10/17] Eliminate local variables used as pseudo-named-arguments, as suggested by @Stof in https://github.com/Seldaek/monolog/pull/76#r740449 --- src/Monolog/Handler/RavenHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index ec3c294d..37a2d265 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -59,9 +59,9 @@ class RavenHandler extends AbstractProcessingHandler } else { $this->ravenClient->captureMessage( $record['formatted']['message'], - $params = $record, - $level = $record['formatted']['level'], - $stack = true + $record, // $params + $record['formatted']['level'], // $level + true // $stack ); } } From 6b4b2a6ac0006ad6df1c3501414770270fbabe95 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 14:26:40 -0700 Subject: [PATCH 11/17] Change key from 'context' to 'exception' in RavenHandlerTest::testException --- tests/Monolog/Handler/RavenHandlerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Monolog/Handler/RavenHandlerTest.php b/tests/Monolog/Handler/RavenHandlerTest.php index e6040f28..c3a69026 100644 --- a/tests/Monolog/Handler/RavenHandlerTest.php +++ b/tests/Monolog/Handler/RavenHandlerTest.php @@ -93,7 +93,7 @@ class RavenHandlerTest extends TestCase } catch (\Exception $e) { - $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('context' => $e)); + $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e)); $handler->handle($record); } From 44d2441782431721218b38d87bd874a2f81855a1 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 26 Apr 2012 15:03:43 -0700 Subject: [PATCH 12/17] Pull MockRavenClient (which depends on Raven_Client) out of tests/Monolog/Handler/RavenHandlerTest.php into a separate file so that the test can pass when raven-php is installed and can be skipped when raven-php is not installed. Addresses @Stof's comment in https://github.com/Seldaek/monolog/pull/76#r740465 --- tests/Monolog/Handler/MockRavenClient.php | 26 ++++++++++++++++++++++ tests/Monolog/Handler/RavenHandlerTest.php | 19 ++++------------ 2 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 tests/Monolog/Handler/MockRavenClient.php diff --git a/tests/Monolog/Handler/MockRavenClient.php b/tests/Monolog/Handler/MockRavenClient.php new file mode 100644 index 00000000..f1f54a8f --- /dev/null +++ b/tests/Monolog/Handler/MockRavenClient.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Raven_Client; + +class MockRavenClient extends Raven_Client +{ + public function capture($data, $stack) + { + $this->lastData = $data; + $this->lastStack = $stack; + } + + public $lastData; + public $lastStack; +} diff --git a/tests/Monolog/Handler/RavenHandlerTest.php b/tests/Monolog/Handler/RavenHandlerTest.php index c3a69026..e146a9ce 100644 --- a/tests/Monolog/Handler/RavenHandlerTest.php +++ b/tests/Monolog/Handler/RavenHandlerTest.php @@ -14,19 +14,6 @@ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; use Monolog\Handler\RavenHandler; -use \Raven_Client; - -class MockRavenClient extends Raven_Client -{ - public function capture($data, $stack) - { - $this->lastData = $data; - $this->lastStack = $stack; - } - - public $lastData; - public $lastStack; -} class RavenHandlerTest extends TestCase { @@ -35,6 +22,8 @@ class RavenHandlerTest extends TestCase if (!class_exists("Raven_Client")) { $this->markTestSkipped("raven/raven not installed"); } + + require_once __DIR__ . '/MockRavenClient.php'; } /** @@ -66,7 +55,7 @@ class RavenHandlerTest extends TestCase $record = $this->getRecord(Logger::DEBUG, "A test debug message"); $handler->handle($record); - $this->assertEquals(Raven_Client::DEBUG, $ravenClient->lastData['level']); + $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']); $this->assertContains($record['message'], $ravenClient->lastData['message']); } @@ -78,7 +67,7 @@ class RavenHandlerTest extends TestCase $record = $this->getRecord(Logger::WARNING, "A test warning message"); $handler->handle($record); - $this->assertEquals(Raven_Client::WARNING, $ravenClient->lastData['level']); + $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']); $this->assertContains($record['message'], $ravenClient->lastData['message']); } From 4830b92725428fb887f2b042be466130e19e13f4 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Fri, 27 Apr 2012 07:06:28 -0700 Subject: [PATCH 13/17] Curly braces on same line for try/catch, as suggested by @stof in https://github.com/Seldaek/monolog/pull/76#r743295 --- tests/Monolog/Handler/RavenHandlerTest.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/Monolog/Handler/RavenHandlerTest.php b/tests/Monolog/Handler/RavenHandlerTest.php index e146a9ce..afad94fd 100644 --- a/tests/Monolog/Handler/RavenHandlerTest.php +++ b/tests/Monolog/Handler/RavenHandlerTest.php @@ -76,12 +76,9 @@ class RavenHandlerTest extends TestCase $ravenClient = $this->getRavenClient(); $handler = $this->getHandler($ravenClient); - try - { + try { $this->methodThatThrowsAnException(); - } - catch (\Exception $e) - { + } catch (\Exception $e) { $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e)); $handler->handle($record); } From 5d172122bc6cabcd52ff1dd57d0d5c949e9f7b06 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Wed, 24 Oct 2012 23:48:18 -0700 Subject: [PATCH 14/17] Address a few of the concerns from @stof in #76. --- src/Monolog/Formatter/RavenFormatter.php | 19 +----------------- src/Monolog/Handler/RavenHandler.php | 25 +++++++++++++++++------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php index 7fdc40f3..23168d8d 100644 --- a/src/Monolog/Formatter/RavenFormatter.php +++ b/src/Monolog/Formatter/RavenFormatter.php @@ -21,28 +21,11 @@ use Raven_Client; */ class RavenFormatter extends NormalizerFormatter { - /** - * Translates Monolog log levels to Raven log levels. - */ - private $logLevels = array( - Logger::DEBUG => Raven_Client::DEBUG, - Logger::INFO => Raven_Client::INFO, - Logger::WARNING => Raven_Client::WARNING, - Logger::ERROR => Raven_Client::ERROR, - Logger::CRITICAL => Raven_Client::ERROR, - Logger::ALERT => Raven_Client::ERROR, - ); - /** * {@inheritdoc} */ public function format(array $record) { - $record = parent::format($record); - - $record['level'] = $this->logLevels[$record['level']]; - $record['message'] = $record['channel'] . ': ' . $record['message']; - - return $record; + return $record['channel'] . ': ' . $record['message']; } } diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 37a2d265..3f8fede2 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -24,6 +24,18 @@ use \Raven_Client; */ class RavenHandler extends AbstractProcessingHandler { + /** + * Translates Monolog log levels to Raven log levels. + */ + private $logLevels = array( + Logger::DEBUG => Raven_Client::DEBUG, + Logger::INFO => Raven_Client::INFO, + Logger::WARNING => Raven_Client::WARNING, + Logger::ERROR => Raven_Client::ERROR, + Logger::CRITICAL => Raven_Client::ERROR, + Logger::ALERT => Raven_Client::ERROR, + ); + /** * @var Raven_Client the client object that sends the message to the server */ @@ -54,15 +66,14 @@ class RavenHandler extends AbstractProcessingHandler */ protected function write(array $record) { + $this->ravenClient->captureMessage( + $record['formatted'], + $record['formatted'], // $params + $this->logLevels[$record['level']], // $level + false // $stack + ); if ($record['level'] >= Logger::ERROR && isset($record['context']['exception'])) { $this->ravenClient->captureException($record['context']['exception']); - } else { - $this->ravenClient->captureMessage( - $record['formatted']['message'], - $record, // $params - $record['formatted']['level'], // $level - true // $stack - ); } } From 368b1f0121c296d2c6db526e07f2f5f2f11e3954 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 25 Oct 2012 09:05:21 -0700 Subject: [PATCH 15/17] Remove RavenFormatter; this is not needed since Raven is a very simple text-oriented interface and doesn't need special processing. --- src/Monolog/Formatter/RavenFormatter.php | 31 ------------------------ src/Monolog/Handler/RavenHandler.php | 11 +-------- 2 files changed, 1 insertion(+), 41 deletions(-) delete mode 100644 src/Monolog/Formatter/RavenFormatter.php diff --git a/src/Monolog/Formatter/RavenFormatter.php b/src/Monolog/Formatter/RavenFormatter.php deleted file mode 100644 index 23168d8d..00000000 --- a/src/Monolog/Formatter/RavenFormatter.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Raven_Client; - -/** - * Serializes a log message for Raven (https://github.com/getsentry/raven-php) - * - * @author Marc Abramowitz - */ -class RavenFormatter extends NormalizerFormatter -{ - /** - * {@inheritdoc} - */ - public function format(array $record) - { - return $record['channel'] . ': ' . $record['message']; - } -} diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 3f8fede2..3573d237 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -13,7 +13,6 @@ namespace Monolog\Handler; use Monolog\Logger; use Monolog\Handler\AbstractProcessingHandler; -use Monolog\Formatter\RavenFormatter; use \Raven_Client; /** @@ -68,7 +67,7 @@ class RavenHandler extends AbstractProcessingHandler { $this->ravenClient->captureMessage( $record['formatted'], - $record['formatted'], // $params + array(), // $params - not used $this->logLevels[$record['level']], // $level false // $stack ); @@ -76,12 +75,4 @@ class RavenHandler extends AbstractProcessingHandler $this->ravenClient->captureException($record['context']['exception']); } } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new RavenFormatter(); - } } From c2850f127c5ca967339f26add922f173bc30fa06 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Thu, 25 Oct 2012 09:27:24 -0700 Subject: [PATCH 16/17] Remove `close` method which was setting `$this->ravenClient = null` --- src/Monolog/Handler/RavenHandler.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 3573d237..50263e79 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -52,14 +52,6 @@ class RavenHandler extends AbstractProcessingHandler $this->ravenClient = $ravenClient; } - /** - * {@inheritdoc} - */ - public function close() - { - $this->ravenClient = null; - } - /** * {@inheritdoc} */ From 10fcd61c118a76f7c0eb0a5c0f2a139debb60a19 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Mon, 29 Oct 2012 23:28:56 -0700 Subject: [PATCH 17/17] Add note about RavenHandler to README.mdown --- README.mdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.mdown b/README.mdown index 786aac16..7f3c213e 100644 --- a/README.mdown +++ b/README.mdown @@ -98,6 +98,8 @@ Handlers - _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server. - _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this for UNIX and TCP sockets. See an [example](https://github.com/Seldaek/monolog/blob/master/doc/sockets.md). +- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server (using + [raven](https://packagist.org/packages/raven/raven)). Wrappers / Special Handlers ---------------------------