From 3030d3da4d3abb18d3c1e3479259af0d88a92488 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 19 May 2014 18:18:25 +0200 Subject: [PATCH] Add option to allow multiline logs in error_log, fixes #366 --- src/Monolog/Handler/ErrorLogHandler.php | 20 ++++++++++++---- tests/Monolog/Handler/ErrorLogHandlerTest.php | 23 +++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/Monolog/Handler/ErrorLogHandler.php b/src/Monolog/Handler/ErrorLogHandler.php index 038db4e5..d1e1ee60 100644 --- a/src/Monolog/Handler/ErrorLogHandler.php +++ b/src/Monolog/Handler/ErrorLogHandler.php @@ -25,13 +25,15 @@ class ErrorLogHandler extends AbstractProcessingHandler const SAPI = 4; protected $messageType; + protected $expandNewlines; /** - * @param integer $messageType Says where the error should go. - * @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 integer $messageType Says where the error should go. + * @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 Boolean $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries */ - public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true) + public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false) { parent::__construct($level, $bubble); @@ -41,6 +43,7 @@ class ErrorLogHandler extends AbstractProcessingHandler } $this->messageType = $messageType; + $this->expandNewlines = $expandNewlines; } /** @@ -67,6 +70,13 @@ class ErrorLogHandler extends AbstractProcessingHandler */ protected function write(array $record) { - error_log((string) $record['formatted'], $this->messageType); + if ($this->expandNewlines) { + $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); + foreach ($lines as $line) { + error_log($line, $this->messageType); + } + } else { + error_log((string) $record['formatted'], $this->messageType); + } } } diff --git a/tests/Monolog/Handler/ErrorLogHandlerTest.php b/tests/Monolog/Handler/ErrorLogHandlerTest.php index 19bfdb5e..626f5f9f 100644 --- a/tests/Monolog/Handler/ErrorLogHandlerTest.php +++ b/tests/Monolog/Handler/ErrorLogHandlerTest.php @@ -4,10 +4,11 @@ namespace Monolog\Handler; use Monolog\TestCase; use Monolog\Logger; +use Monolog\Formatter\LineFormatter; function error_log() { - $GLOBALS['error_log'] = func_get_args(); + $GLOBALS['error_log'][] = func_get_args(); } class ErrorLogHandlerTest extends TestCase @@ -35,9 +36,23 @@ class ErrorLogHandlerTest extends TestCase { $type = ErrorLogHandler::OPERATING_SYSTEM; $handler = new ErrorLogHandler($type); - $handler->handle($this->getRecord(Logger::ERROR)); + $handler->setFormatter(new LineFormatter('%channel%.%level_name%: %message% %context% %extra%', null, true)); + $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); - $this->assertStringMatchesFormat('[%s] test.ERROR: test [] []', $GLOBALS['error_log'][0]); - $this->assertSame($GLOBALS['error_log'][1], $type); + $this->assertSame("test.ERROR: Foo\nBar\r\n\r\nBaz [] []", $GLOBALS['error_log'][0][0]); + $this->assertSame($GLOBALS['error_log'][0][1], $type); + + $handler = new ErrorLogHandler($type, Logger::DEBUG, true, true); + $handler->setFormatter(new LineFormatter(null, null, true)); + $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); + + $this->assertStringMatchesFormat('[%s] test.ERROR: Foo', $GLOBALS['error_log'][1][0]); + $this->assertSame($GLOBALS['error_log'][1][1], $type); + + $this->assertStringMatchesFormat('Bar', $GLOBALS['error_log'][2][0]); + $this->assertSame($GLOBALS['error_log'][2][1], $type); + + $this->assertStringMatchesFormat('Baz [] []', $GLOBALS['error_log'][3][0]); + $this->assertSame($GLOBALS['error_log'][3][1], $type); } }