Skip to content

Commit

Permalink
#6622 Logger refactoring: formatting messages is now done through For…
Browse files Browse the repository at this point in the history
…matters instead of events
  • Loading branch information
mnapoli committed Dec 1, 2014
1 parent 1d5aedc commit 65c96bb
Show file tree
Hide file tree
Showing 19 changed files with 328 additions and 254 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'

### Breaking Changes
* Some duplicate reports from UserSettings plugin have been removed. Widget URLs for those reports will still work till May 1st 2015. Please update those to the new reports of DevicesDetection plugin.
* The following events have been removed:
* `Log.formatFileMessage`
* `Log.formatDatabaseMessage`
* `Log.formatScreenMessage`
* These events where very specific events for an internal need (logging exceptions) and have been replaced by a more extensible solution.

### Deprecations
* The API method `UserSettings.getBrowserVersion` is deprecated and will be removed from May 1st 2015. Use `DevicesDetection.getBrowserVersions` instead
Expand Down
19 changes: 0 additions & 19 deletions core/Error.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
*/
namespace Piwik;

use Piwik\Log\Formatter\ErrorHtmlFormatter;
use Piwik\Log\Formatter\ErrorTextFormatter;

require_once PIWIK_INCLUDE_PATH . '/core/Log.php';

/**
Expand Down Expand Up @@ -123,24 +120,8 @@ public static function getErrNoString($errno)
}
}

public static function formatFileAndDBLogMessage(&$message, $level, $tag, $datetime, Log $log)
{
$formatter = new ErrorTextFormatter();
$message = $formatter->format($message, $level, $tag, $datetime, $log);
}

public static function formatScreenMessage(&$message, $level, $tag, $datetime, $log)
{
$formatter = new ErrorHtmlFormatter();
$message = $formatter->format($message, $level, $tag, $datetime, $log);
}

public static function setErrorHandler()
{
Piwik::addAction('Log.formatFileMessage', array('Piwik\Error', 'formatFileAndDBLogMessage'));
Piwik::addAction('Log.formatDatabaseMessage', array('Piwik\Error', 'formatFileAndDBLogMessage'));
Piwik::addAction('Log.formatScreenMessage', array('Piwik\Error', 'formatScreenMessage'));

set_error_handler(array('Piwik\Error', 'errorHandler'));
}

Expand Down
20 changes: 0 additions & 20 deletions core/ExceptionHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@
*/
namespace Piwik;

use Piwik\Log\Formatter\ExceptionHtmlFormatter;
use Piwik\Log\Formatter\ExceptionTextFormatter;
use Piwik\Plugin;

/**
* Contains Piwik's uncaught exception handler and log file formatting for exception
* instances.
Expand All @@ -27,25 +23,9 @@ class ExceptionHandler

public static function setUp()
{
Piwik::addAction('Log.formatFileMessage', array('Piwik\ExceptionHandler', 'formatFileAndDBLogMessage'));
Piwik::addAction('Log.formatDatabaseMessage', array('Piwik\ExceptionHandler', 'formatFileAndDBLogMessage'));
Piwik::addAction('Log.formatScreenMessage', array('Piwik\ExceptionHandler', 'formatScreenMessage'));

set_exception_handler(array('Piwik\ExceptionHandler', 'logException'));
}

public static function formatFileAndDBLogMessage(&$message, $level, $tag, $datetime, Log $log)
{
$formatter = new ExceptionTextFormatter();
$message = $formatter->format($message, $level, $tag, $datetime, $log);
}

public static function formatScreenMessage(&$message, $level, $tag, $datetime, $log)
{
$formatter = new ExceptionHtmlFormatter();
$message = $formatter->format($message, $level, $tag, $datetime, $log);
}

public static function logException(\Exception $exception)
{
Log::error($exception);
Expand Down
26 changes: 2 additions & 24 deletions core/Log.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@

use Piwik\Container\StaticContainer;
use Piwik\Db;
use Piwik\Log\Backend\ScreenBackend;
use Piwik\Log\Backend\StdOutBackend;
use Piwik\Log\LoggerFactory;

/**
* Logging utility class.
Expand Down Expand Up @@ -308,16 +309,6 @@ private function writeMessage($level, $tag, $datetime, $message)
foreach ($this->writers as $writer) {
call_user_func($writer, $level, $tag, $datetime, $message, $this);
}

// TODO this hack should be removed
if ($level == self::ERROR) {
$screenBackend = new ScreenBackend($this->logMessageFormat);
$message = $screenBackend->getMessageFormattedScreen($level, $tag, $datetime, $message, $this);
$this->writeErrorToStandardErrorOutput($message);
if (!isset($this->writers['screen'])) {
echo $message;
}
}
}

private static function logMessage($level, $message, $sprintfParams)
Expand Down Expand Up @@ -357,19 +348,6 @@ private function getClassNameThatIsLogging($backtrace)
return false;
}

/**
* @param $message
*/
private function writeErrorToStandardErrorOutput($message)
{
if (defined('PIWIK_TEST_MODE')) {
// do not log on stderr during tests (prevent display of errors in CI output)
return;
}
$fe = fopen('php://stderr', 'w');
fwrite($fe, $message);
}

/**
* Returns the name of the plugin/class that triggered the log.
*
Expand Down
28 changes: 9 additions & 19 deletions core/Log/Backend/Backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,48 +9,38 @@
namespace Piwik\Log\Backend;

use Piwik\Log;
use Piwik\Log\Formatter\Formatter;

/**
* Log backend.
*/
abstract class Backend
{
/**
* The log message format string that turns a tag name, date-time and message into
* one string to log.
*
* @var string
* @var Formatter
*/
private $logMessageFormat;
private $formatter;

public function __construct($logMessageFormat)
public function __construct(Formatter $formatter)
{
$this->logMessageFormat = $logMessageFormat;
$this->formatter = $formatter;
}

public abstract function __invoke($level, $tag, $datetime, $message, Log $logger);

/**
* Creates log message combining logging info including a log level, tag name,
* date time, and caller-provided log message. The log message can be set through
* the `[log] string_message_format` INI config option. By default it will
* create log messages like:
*
* **LEVEL [tag:datetime] log message**
* Formats the log message using the configured formatter.
*
* @param int $level
* @param string $tag
* @param string $datetime
* @param string $message
* @param Log $logger
* @return string
*/
protected function formatMessage($level, $tag, $datetime, $message)
protected function formatMessage($level, $tag, $datetime, $message, Log $logger)
{
return str_replace(
array("%tag%", "%message%", "%datetime%", "%level%"),
array($tag, trim($message), $datetime, $this->getStringLevel($level)),
$this->logMessageFormat
);
return trim($this->formatter->format($message, $level, $tag, $datetime, $logger));
}

protected function getStringLevel($level)
Expand Down
37 changes: 2 additions & 35 deletions core/Log/Backend/DatabaseBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
use Piwik\Common;
use Piwik\Db;
use Piwik\Log;
use Piwik\Piwik;

/**
* Writes log to database.
Expand All @@ -20,7 +19,8 @@ class DatabaseBackend extends Backend
{
public function __invoke($level, $tag, $datetime, $message, Log $logger)
{
$message = $this->getMessageFormattedDatabase($level, $tag, $datetime, $message, $logger);
$message = $this->formatMessage($level, $tag, $datetime, $message, $logger);

if (empty($message)) {
return;
}
Expand All @@ -31,37 +31,4 @@ public function __invoke($level, $tag, $datetime, $message, Log $logger)

Db::query($sql, array($tag, $datetime, self::getStringLevel($level), (string)$message));
}

private function getMessageFormattedDatabase($level, $tag, $datetime, $message, $logger)
{
if (is_string($message)) {
$message = $this->formatMessage($level, $tag, $datetime, $message);
} else {
/**
* Triggered when trying to log an object to a database table. Plugins can use
* this event to convert objects to strings before they are logged.
*
* **Example**
*
* public function formatDatabaseMessage(&$message, $level, $tag, $datetime, $logger) {
* if ($message instanceof MyCustomDebugInfo) {
* $message = $message->formatForDatabase();
* }
* }
*
* @param mixed &$message The object that is being logged. Event handlers should
* check if the object is of a certain type and if it is,
* set `$message` to the string that should be logged.
* @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 Log $logger The Log singleton.
*/
Piwik::postEvent(Log::FORMAT_DATABASE_MESSAGE_EVENT, array(&$message, $level, $tag, $datetime, $logger));
}
$message = trim($message);

return $message;
}
}
47 changes: 5 additions & 42 deletions core/Log/Backend/FileBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

use Piwik\Filechecks;
use Piwik\Log;
use Piwik\Piwik;
use Piwik\Log\Formatter\Formatter;

/**
* Writes log to file.
Expand All @@ -24,19 +24,17 @@ class FileBackend extends Backend
*/
private $logToFilePath;

public function __construct($logMessageFormat, $logToFilePath)
public function __construct(Formatter $formatter, $logToFilePath)
{
$this->logToFilePath = $logToFilePath;

parent::__construct($logMessageFormat);
parent::__construct($formatter);
}

public function __invoke($level, $tag, $datetime, $message, Log $logger)
{
$message = $this->getMessageFormattedFile($level, $tag, $datetime, $message, $logger);
if (empty($message)) {
return;
}
$message = $this->formatMessage($level, $tag, $datetime, $message, $logger);
$message = str_replace("\n", "\n ", $message) . "\n";

if (!@file_put_contents($this->logToFilePath, $message, FILE_APPEND)
&& !defined('PIWIK_TEST_MODE')
Expand All @@ -45,39 +43,4 @@ public function __invoke($level, $tag, $datetime, $message, Log $logger)
throw new \Exception($message);
}
}

private function getMessageFormattedFile($level, $tag, $datetime, $message, Log $logger)
{
if (is_string($message)) {
$message = $this->formatMessage($level, $tag, $datetime, $message);
} else {
/**
* Triggered when trying to log an object to a file. Plugins can use
* this event to convert objects to strings before they are logged.
*
* **Example**
*
* public function formatFileMessage(&$message, $level, $tag, $datetime, $logger) {
* if ($message instanceof MyCustomDebugInfo) {
* $message = $message->formatForFile();
* }
* }
*
* @param mixed &$message The object that is being logged. Event handlers should
* check if the object is of a certain type and if it is,
* set `$message` to the string that should be logged.
* @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 Log $logger The Log instance.
*/
Piwik::postEvent(Log::FORMAT_FILE_MESSAGE_EVENT, array(&$message, $level, $tag, $datetime, $logger));
}

$message = trim($message);
$message = str_replace("\n", "\n ", $message);

return $message . "\n";
}
}
79 changes: 0 additions & 79 deletions core/Log/Backend/ScreenBackend.php

This file was deleted.

Loading

0 comments on commit 65c96bb

Please sign in to comment.