From ccb4aeba216f8ad60a00ddea3fe823dbce4dc4b1 Mon Sep 17 00:00:00 2001 From: Pavel Golovin Date: Mon, 10 Oct 2016 18:57:57 +0300 Subject: [PATCH 1/6] Remove substitution for not defined variables If variable in extra or context isn't defined, than placeholder will not not be replaced in format string. This patch remove all not replaced placeholders --- src/Monolog/Formatter/LineFormatter.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 0e62aa35..554fff6e 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -76,6 +76,8 @@ class LineFormatter extends NormalizerFormatter } } + $output = preg_replace('/%extra\..+?%/', '', $output); + foreach ($vars['context'] as $var => $val) { if (false !== strpos($output, '%context.'.$var.'%')) { $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output); @@ -83,6 +85,8 @@ class LineFormatter extends NormalizerFormatter } } + $output = preg_replace('/%context\..+?%/', '', $output); + if ($this->ignoreEmptyContextAndExtra) { if (empty($vars['context'])) { unset($vars['context']); From c3c0abf2a42e2e9575246ea52f84e2249642d0a3 Mon Sep 17 00:00:00 2001 From: Pavel Golovin Date: Mon, 10 Oct 2016 19:01:08 +0300 Subject: [PATCH 2/6] Update LineFormatter.php --- src/Monolog/Formatter/LineFormatter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 554fff6e..7122319d 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -76,7 +76,7 @@ class LineFormatter extends NormalizerFormatter } } - $output = preg_replace('/%extra\..+?%/', '', $output); + $output = preg_replace('/%extra\..+?%/', '', $output); foreach ($vars['context'] as $var => $val) { if (false !== strpos($output, '%context.'.$var.'%')) { @@ -85,7 +85,7 @@ class LineFormatter extends NormalizerFormatter } } - $output = preg_replace('/%context\..+?%/', '', $output); + $output = preg_replace('/%context\..+?%/', '', $output); if ($this->ignoreEmptyContextAndExtra) { if (empty($vars['context'])) { From d234839de122875fa9db482d469b4c8d9af295de Mon Sep 17 00:00:00 2001 From: Tugdual Saunier Date: Tue, 11 Oct 2016 13:01:36 +0100 Subject: [PATCH 3/6] Make the RavenHandler picks the first highest record as main --- src/Monolog/Handler/RavenHandler.php | 2 +- tests/Monolog/Handler/RavenHandlerTest.php | 26 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Monolog/Handler/RavenHandler.php b/src/Monolog/Handler/RavenHandler.php index 0b9f3679..d3f9ed8f 100644 --- a/src/Monolog/Handler/RavenHandler.php +++ b/src/Monolog/Handler/RavenHandler.php @@ -84,7 +84,7 @@ class RavenHandler extends AbstractProcessingHandler // the record with the highest severity is the "main" one $record = array_reduce($records, function ($highest, $record) { - if ($record['level'] >= $highest['level']) { + if ($record['level'] > $highest['level']) { return $record; } diff --git a/tests/Monolog/Handler/RavenHandlerTest.php b/tests/Monolog/Handler/RavenHandlerTest.php index a7c4845f..574077df 100644 --- a/tests/Monolog/Handler/RavenHandlerTest.php +++ b/tests/Monolog/Handler/RavenHandlerTest.php @@ -195,6 +195,32 @@ class RavenHandlerTest extends TestCase $handler->handleBatch($records); } + public function testHandleBatchPicksProperMessage() + { + $records = array( + $this->getRecord(Logger::DEBUG, 'debug message 1'), + $this->getRecord(Logger::DEBUG, 'debug message 2'), + $this->getRecord(Logger::INFO, 'information 1'), + $this->getRecord(Logger::ERROR, 'error 1'), + $this->getRecord(Logger::WARNING, 'warning'), + $this->getRecord(Logger::ERROR, 'error 2'), + $this->getRecord(Logger::INFO, 'information 2'), + ); + + $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); + $logFormatter->expects($this->once())->method('formatBatch'); + + $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); + $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) { + return $record['message'] == 'error 1'; + })); + + $handler = $this->getHandler($this->getRavenClient()); + $handler->setBatchFormatter($logFormatter); + $handler->setFormatter($formatter); + $handler->handleBatch($records); + } + public function testGetSetBatchFormatter() { $ravenClient = $this->getRavenClient(); From 2c1ed388c2a488846244b9b94bc57a2731217d04 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 13 Nov 2016 20:12:29 +0100 Subject: [PATCH 4/6] Allow overriding the routing key in AMQPHandler, fixes #874 --- src/Monolog/Handler/AmqpHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Monolog/Handler/AmqpHandler.php b/src/Monolog/Handler/AmqpHandler.php index 95a91fcd..e5a46bc0 100644 --- a/src/Monolog/Handler/AmqpHandler.php +++ b/src/Monolog/Handler/AmqpHandler.php @@ -111,7 +111,7 @@ class AmqpHandler extends AbstractProcessingHandler * @param array $record * @return string */ - private function getRoutingKey(array $record) + protected function getRoutingKey(array $record) { $routingKey = sprintf( '%s.%s', From cc8a013611b8daefbf3f8ef9803ee49289ad9dc2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 13 Nov 2016 20:17:30 +0100 Subject: [PATCH 5/6] Optimize removal of leftover extra/context placeholders, refs #866 --- src/Monolog/Formatter/LineFormatter.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 7122319d..8ffe6012 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -76,7 +76,6 @@ class LineFormatter extends NormalizerFormatter } } - $output = preg_replace('/%extra\..+?%/', '', $output); foreach ($vars['context'] as $var => $val) { if (false !== strpos($output, '%context.'.$var.'%')) { @@ -85,8 +84,6 @@ class LineFormatter extends NormalizerFormatter } } - $output = preg_replace('/%context\..+?%/', '', $output); - if ($this->ignoreEmptyContextAndExtra) { if (empty($vars['context'])) { unset($vars['context']); @@ -105,6 +102,11 @@ class LineFormatter extends NormalizerFormatter } } + // remove leftover %extra.xxx% and %context.xxx% if any + if (false !== strpos($output, '%')) { + $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output); + } + return $output; } From 371b8ebb1bdfe5f254024fed671959f6c452aff7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 13 Nov 2016 20:25:52 +0100 Subject: [PATCH 6/6] Add a RollbarHandler::flush() and make it close automatically on shutdown, fixes #864, closes #865 --- src/Monolog/Handler/RollbarHandler.php | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Monolog/Handler/RollbarHandler.php b/src/Monolog/Handler/RollbarHandler.php index 9a2b1325..0d9de1a2 100644 --- a/src/Monolog/Handler/RollbarHandler.php +++ b/src/Monolog/Handler/RollbarHandler.php @@ -58,6 +58,8 @@ class RollbarHandler extends AbstractProcessingHandler */ private $hasRecords = false; + protected $initialized = false; + /** * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token * @param int $level The minimum logging level at which this handler will be triggered @@ -75,6 +77,12 @@ class RollbarHandler extends AbstractProcessingHandler */ protected function write(array $record) { + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + $context = $record['context']; $payload = array(); if (isset($context['payload'])) { @@ -105,14 +113,19 @@ class RollbarHandler extends AbstractProcessingHandler $this->hasRecords = true; } - /** - * {@inheritdoc} - */ - public function close() + public function flush() { if ($this->hasRecords) { $this->rollbarNotifier->flush(); $this->hasRecords = false; } } + + /** + * {@inheritdoc} + */ + public function close() + { + $this->flush(); + } }