diff options
author | Matthieu Napoli <matthieu@mnapoli.fr> | 2014-12-01 05:43:03 +0300 |
---|---|---|
committer | Matthieu Napoli <matthieu@mnapoli.fr> | 2014-12-01 05:51:37 +0300 |
commit | 0794be0d5551998b683ac934e00604d277fe69e9 (patch) | |
tree | 26a43fbc68f219fc6116ceebfed132ad1c9107dd /core | |
parent | f1fae09be4507bd9dedfc949deab98108b47b23e (diff) |
#6622 Logger refactoring: use a "record" array similar to Monolog to ease future transition
Diffstat (limited to 'core')
-rw-r--r-- | core/Log.php | 36 | ||||
-rw-r--r-- | core/Log/Backend/Backend.php | 30 | ||||
-rw-r--r-- | core/Log/Backend/DatabaseBackend.php | 6 | ||||
-rw-r--r-- | core/Log/Backend/FileBackend.php | 4 | ||||
-rw-r--r-- | core/Log/Backend/StdErrBackend.php | 6 | ||||
-rw-r--r-- | core/Log/Backend/StdOutBackend.php | 6 | ||||
-rw-r--r-- | core/Log/Formatter/AddRequestIdFormatter.php | 12 | ||||
-rw-r--r-- | core/Log/Formatter/ErrorHtmlFormatter.php | 10 | ||||
-rw-r--r-- | core/Log/Formatter/ErrorTextFormatter.php | 8 | ||||
-rw-r--r-- | core/Log/Formatter/ExceptionHtmlFormatter.php | 10 | ||||
-rw-r--r-- | core/Log/Formatter/ExceptionTextFormatter.php | 8 | ||||
-rw-r--r-- | core/Log/Formatter/Formatter.php | 15 | ||||
-rw-r--r-- | core/Log/Formatter/HtmlPreFormatter.php | 13 | ||||
-rw-r--r-- | core/Log/Formatter/LineMessageFormatter.php | 23 | ||||
-rw-r--r-- | core/Log/Processor/SprintfProcessor.php | 9 |
15 files changed, 103 insertions, 93 deletions
diff --git a/core/Log.php b/core/Log.php index 4091fa532d..f759b351d7 100644 --- a/core/Log.php +++ b/core/Log.php @@ -244,25 +244,36 @@ class Log extends Singleton return $this->currentLogLevel; } - private function doLog($level, $message, $sprintfParams = array()) + private function doLog($level, $message, $parameters = array()) { if (!$this->shouldLoggerLog($level)) { return; } + // Create a record similar to Monolog to ease future transition + $record = array( + 'message' => $message, + 'context' => $parameters, + 'channel' => 'piwik', + 'level' => $level, + 'level_name' => self::getStringLevel($level), + 'time' => new \DateTime(), + 'extra' => array(), + ); + foreach ($this->processors as $processor) { - $message = $processor($message, $sprintfParams, $level); + $record = $processor($record); } - $tag = $this->getLoggingClassName(); + $record['extra']['class'] = $this->getLoggingClassName(); - $this->writeMessage($level, $tag, date("Y-m-d H:i:s"), $message); + $this->writeMessage($record, date("Y-m-d H:i:s")); } - private function writeMessage($level, $tag, $datetime, $message) + private function writeMessage(array $record) { foreach ($this->writers as $writer) { - call_user_func($writer, $level, $tag, $datetime, $message, $this); + call_user_func($writer, $record, $this); } } @@ -312,4 +323,17 @@ class Log extends Singleton } return $tag; } + + private function getStringLevel($level) + { + static $levelToName = array( + Log::NONE => 'NONE', + Log::ERROR => 'ERROR', + Log::WARN => 'WARN', + Log::INFO => 'INFO', + Log::DEBUG => 'DEBUG', + Log::VERBOSE => 'VERBOSE' + ); + return $levelToName[$level]; + } } diff --git a/core/Log/Backend/Backend.php b/core/Log/Backend/Backend.php index e5e77753de..0b25316c4d 100644 --- a/core/Log/Backend/Backend.php +++ b/core/Log/Backend/Backend.php @@ -26,33 +26,25 @@ abstract class Backend $this->formatter = $formatter; } - public abstract function __invoke($level, $tag, $datetime, $message, Log $logger); + /** + * Write the log record to the backend. + * + * @param array $record + * @param Log $logger + */ + public abstract function __invoke(array $record, Log $logger); /** * Formats the log message using the configured formatter. * - * @param int $level - * @param string $tag - * @param string $datetime - * @param string $message + * @param array $record * @param Log $logger * @return string */ - protected function formatMessage($level, $tag, $datetime, $message, Log $logger) + protected function formatMessage(array $record, Log $logger) { - return trim($this->formatter->format($message, $level, $tag, $datetime, $logger)); - } + $record = $this->formatter->format($record, $logger); - protected function getStringLevel($level) - { - static $levelToName = array( - Log::NONE => 'NONE', - Log::ERROR => 'ERROR', - Log::WARN => 'WARN', - Log::INFO => 'INFO', - Log::DEBUG => 'DEBUG', - Log::VERBOSE => 'VERBOSE' - ); - return $levelToName[$level]; + return trim($record['message']); } } diff --git a/core/Log/Backend/DatabaseBackend.php b/core/Log/Backend/DatabaseBackend.php index 5c7e8710bb..0dc707df78 100644 --- a/core/Log/Backend/DatabaseBackend.php +++ b/core/Log/Backend/DatabaseBackend.php @@ -17,9 +17,9 @@ use Piwik\Log; */ class DatabaseBackend extends Backend { - public function __invoke($level, $tag, $datetime, $message, Log $logger) + public function __invoke(array $record, Log $logger) { - $message = $this->formatMessage($level, $tag, $datetime, $message, $logger); + $message = $this->formatMessage($record, $logger); if (empty($message)) { return; @@ -29,6 +29,6 @@ class DatabaseBackend extends Backend . " (tag, timestamp, level, message)" . " VALUES (?, ?, ?, ?)"; - Db::query($sql, array($tag, $datetime, self::getStringLevel($level), (string)$message)); + Db::query($sql, array($record['extra']['class'], $record['time']->format('Y-m-d H:i:s'), $record['level_name'], (string) $message)); } } diff --git a/core/Log/Backend/FileBackend.php b/core/Log/Backend/FileBackend.php index 6759827a77..2ffcea1e41 100644 --- a/core/Log/Backend/FileBackend.php +++ b/core/Log/Backend/FileBackend.php @@ -31,9 +31,9 @@ class FileBackend extends Backend parent::__construct($formatter); } - public function __invoke($level, $tag, $datetime, $message, Log $logger) + public function __invoke(array $record, Log $logger) { - $message = $this->formatMessage($level, $tag, $datetime, $message, $logger); + $message = $this->formatMessage($record, $logger); $message = str_replace("\n", "\n ", $message) . "\n"; if (!@file_put_contents($this->logToFilePath, $message, FILE_APPEND) diff --git a/core/Log/Backend/StdErrBackend.php b/core/Log/Backend/StdErrBackend.php index c2ef47cc75..8f8bb00252 100644 --- a/core/Log/Backend/StdErrBackend.php +++ b/core/Log/Backend/StdErrBackend.php @@ -28,13 +28,13 @@ class StdErrBackend extends Backend parent::__construct($formatter); } - public function __invoke($level, $tag, $datetime, $message, Log $logger) + public function __invoke(array $record, Log $logger) { - if ($level != Log::ERROR) { + if ($record['level'] != Log::ERROR) { return; } - $message = $this->formatMessage($level, $tag, $datetime, $message, $logger) . "\n"; + $message = $this->formatMessage($record, $logger) . "\n"; // Do not log on stderr during tests (prevent display of errors in CI output) if (! defined('PIWIK_TEST_MODE')) { diff --git a/core/Log/Backend/StdOutBackend.php b/core/Log/Backend/StdOutBackend.php index 2429289404..fd0a89c5ec 100644 --- a/core/Log/Backend/StdOutBackend.php +++ b/core/Log/Backend/StdOutBackend.php @@ -15,10 +15,8 @@ use Piwik\Log; */ class StdOutBackend extends Backend { - public function __invoke($level, $tag, $datetime, $message, Log $logger) + public function __invoke(array $record, Log $logger) { - $message = $this->formatMessage($level, $tag, $datetime, $message, $logger); - - echo $message . "\n"; + echo $this->formatMessage($record, $logger) . "\n"; } } diff --git a/core/Log/Formatter/AddRequestIdFormatter.php b/core/Log/Formatter/AddRequestIdFormatter.php index ee061d1d0d..3de87af71f 100644 --- a/core/Log/Formatter/AddRequestIdFormatter.php +++ b/core/Log/Formatter/AddRequestIdFormatter.php @@ -16,7 +16,7 @@ use Piwik\Log; */ class AddRequestIdFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { static $currentRequestKey; @@ -24,17 +24,17 @@ class AddRequestIdFormatter extends Formatter $currentRequestKey = substr(Common::generateUniqId(), 0, 5); } - $message = $this->next($message, $level, $tag, $datetime, $logger); + $record = $this->next($record, $logger); - if (! is_string($message)) { - return $message; + if (! is_string($record['message'])) { + return $record; } // Decorate the error message with the "request id" if (!defined('PIWIK_TEST_MODE')) { - $message = '[' . $currentRequestKey . '] ' . $message; + $record['message'] = '[' . $currentRequestKey . '] ' . $record['message']; } - return $message; + return $record; } } diff --git a/core/Log/Formatter/ErrorHtmlFormatter.php b/core/Log/Formatter/ErrorHtmlFormatter.php index 210af8b71f..f499df9b10 100644 --- a/core/Log/Formatter/ErrorHtmlFormatter.php +++ b/core/Log/Formatter/ErrorHtmlFormatter.php @@ -18,10 +18,12 @@ use Piwik\Version; */ class ErrorHtmlFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { + $message = $record['message']; + if (! $message instanceof Error) { - return $this->next($message, $level, $tag, $datetime, $logger); + return $this->next($record, $logger); } $errno = $message->errno & error_reporting(); @@ -50,6 +52,8 @@ class ErrorHtmlFormatter extends Formatter $html .= "</div><br />"; $html .= "\n </pre></div><br />"; - return $html; + $record['message'] = $html; + + return $record; } } diff --git a/core/Log/Formatter/ErrorTextFormatter.php b/core/Log/Formatter/ErrorTextFormatter.php index 6cfb5739b7..e2651ad638 100644 --- a/core/Log/Formatter/ErrorTextFormatter.php +++ b/core/Log/Formatter/ErrorTextFormatter.php @@ -16,13 +16,15 @@ use Piwik\Log; */ class ErrorTextFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { + $message = $record['message']; + if ($message instanceof Error) { - $message = $message->errfile . '(' . $message->errline . '): ' . Error::getErrNoString($message->errno) + $record['message'] = $message->errfile . '(' . $message->errline . '): ' . Error::getErrNoString($message->errno) . ' - ' . $message->errstr . "\n" . $message->backtrace; } - return $this->next($message, $level, $tag, $datetime, $logger); + return $this->next($record, $logger); } } diff --git a/core/Log/Formatter/ExceptionHtmlFormatter.php b/core/Log/Formatter/ExceptionHtmlFormatter.php index 309dbafe7f..5be62bcb67 100644 --- a/core/Log/Formatter/ExceptionHtmlFormatter.php +++ b/core/Log/Formatter/ExceptionHtmlFormatter.php @@ -17,10 +17,10 @@ use Piwik\Log; */ class ExceptionHtmlFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { - if (! $message instanceof \Exception) { - return $this->next($message, $level, $tag, $datetime, $logger); + if (! $record['message'] instanceof \Exception) { + return $this->next($record, $logger); } Common::sendHeader('Content-Type: text/html; charset=utf-8'); @@ -28,6 +28,8 @@ class ExceptionHtmlFormatter extends Formatter $outputFormat = strtolower(Common::getRequestVar('format', 'html', 'string')); $response = new ResponseBuilder($outputFormat); - return $response->getResponseException(new \Exception($message->getMessage())); + $record['message'] = $response->getResponseException(new \Exception($record['message']->getMessage())); + + return $record; } } diff --git a/core/Log/Formatter/ExceptionTextFormatter.php b/core/Log/Formatter/ExceptionTextFormatter.php index 0fcf5f6ea2..1e0bd0ed12 100644 --- a/core/Log/Formatter/ExceptionTextFormatter.php +++ b/core/Log/Formatter/ExceptionTextFormatter.php @@ -16,13 +16,15 @@ use Piwik\Log; */ class ExceptionTextFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { + $message = $record['message']; + if ($message instanceof \Exception) { - $message = sprintf("%s(%d): %s\n%s", $message->getFile(), $message->getLine(), $message->getMessage(), + $record['message'] = sprintf("%s(%d): %s\n%s", $message->getFile(), $message->getLine(), $message->getMessage(), ExceptionHandler::$debugBacktraceForTests ?: $message->getTraceAsString()); } - return $this->next($message, $level, $tag, $datetime, $logger); + return $this->next($record, $logger); } } diff --git a/core/Log/Formatter/Formatter.php b/core/Log/Formatter/Formatter.php index 47d501e247..66de41423c 100644 --- a/core/Log/Formatter/Formatter.php +++ b/core/Log/Formatter/Formatter.php @@ -24,15 +24,12 @@ abstract class Formatter protected $next; /** - * @param mixed $message Log message. - * @param int $level The log level used with this log entry. - * @param string $tag The current plugin that started logging (or if no plugin, the current class). - * @param string $datetime Datetime of the logging call. + * @param array $record * @param Log $logger * - * @return mixed + * @return array Updated record. */ - public abstract function format($message, $level, $tag, $datetime, Log $logger); + public abstract function format(array $record, Log $logger); /** * Chain of responsibility pattern. @@ -44,12 +41,12 @@ abstract class Formatter $this->next = $formatter; } - protected function next($message, $level, $tag, $datetime, Log $logger) + protected function next(array $record, Log $logger) { if (! $this->next) { - return $message; + return $record; } - return $this->next->format($message, $level, $tag, $datetime, $logger); + return $this->next->format($record, $logger); } } diff --git a/core/Log/Formatter/HtmlPreFormatter.php b/core/Log/Formatter/HtmlPreFormatter.php index e8c095c047..ecc52fc149 100644 --- a/core/Log/Formatter/HtmlPreFormatter.php +++ b/core/Log/Formatter/HtmlPreFormatter.php @@ -16,19 +16,18 @@ use Piwik\Log; */ class HtmlPreFormatter extends Formatter { - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { - $message = $this->next($message, $level, $tag, $datetime, $logger); + $record = $this->next($record, $logger); - if (! is_string($message)) { - return $message; + if (! is_string($record['message'])) { + return $record; } if (!Common::isPhpCliMode()) { - $message = Common::sanitizeInputValue($message); - $message = '<pre>' . $message . '</pre>'; + $record['message'] = '<pre>' . Common::sanitizeInputValue($record['message']) . '</pre>'; } - return $message; + return $record; } } diff --git a/core/Log/Formatter/LineMessageFormatter.php b/core/Log/Formatter/LineMessageFormatter.php index 87bc54dfa1..4b778f858a 100644 --- a/core/Log/Formatter/LineMessageFormatter.php +++ b/core/Log/Formatter/LineMessageFormatter.php @@ -28,31 +28,18 @@ class LineMessageFormatter extends Formatter $this->logMessageFormat = $logMessageFormat; } - public function format($message, $level, $tag, $datetime, Log $logger) + public function format(array $record, Log $logger) { - if (! is_string($message)) { + if (! is_string($record['message'])) { throw new \InvalidArgumentException('Trying to log a message that is not a string'); } - $message = str_replace( + $record['message'] = str_replace( array("%tag%", "%message%", "%datetime%", "%level%"), - array($tag, trim($message), $datetime, $this->getStringLevel($level)), + array($record['extra']['class'], trim($record['message']), $record['time']->format('Y-m-d H:i:s'), $record['level_name']), $this->logMessageFormat ); - return $this->next($message, $level, $tag, $datetime, $logger); - } - - private function getStringLevel($level) - { - static $levelToName = array( - Log::NONE => 'NONE', - Log::ERROR => 'ERROR', - Log::WARN => 'WARN', - Log::INFO => 'INFO', - Log::DEBUG => 'DEBUG', - Log::VERBOSE => 'VERBOSE' - ); - return $levelToName[$level]; + return $this->next($record, $logger); } } diff --git a/core/Log/Processor/SprintfProcessor.php b/core/Log/Processor/SprintfProcessor.php index 8ec0d61db2..9032f5ba7a 100644 --- a/core/Log/Processor/SprintfProcessor.php +++ b/core/Log/Processor/SprintfProcessor.php @@ -13,15 +13,18 @@ namespace Piwik\Log\Processor; */ class SprintfProcessor { - public function __invoke($message, array $parameters = array(), $level) + public function __invoke(array $record) { + $message = $record['message']; + $parameters = $record['context']; + if (is_string($message) && !empty($parameters)) { $parameters = $this->ensureParametersAreStrings($parameters); - $message = vsprintf($message, $parameters); + $record['message'] = vsprintf($message, $parameters); } - return $message; + return $record; } private function ensureParametersAreStrings(array $parameters) |