Skip to content
Extraits de code Groupes Projets
Valider 4f1e2c1d rédigé par Matthieu Napoli's avatar Matthieu Napoli
Parcourir les fichiers

Fixes #7017 (Infinite loop when logging to database at debug level) + tests

The query log is momentarily disabled when the database log handler inserts in database
parent 18ff11d2
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -35,6 +35,8 @@ class Db
{
private static $connection = null;
private static $logQueries = true;
/**
* Returns the database connection and creates it if it hasn't been already.
*
......@@ -710,7 +712,27 @@ class Db
private static function logSql($functionName, $sql, $parameters = array())
{
if (self::$logQueries === false) {
return;
}
// NOTE: at the moment we don't log parameters in order to avoid sensitive information leaks
Log::debug("Db::%s() executing SQL: %s", $functionName, $sql);
}
/**
* @param bool $enable
*/
public static function enableQueryLog($enable)
{
self::$logQueries = $enable;
}
/**
* @return boolean
*/
public static function isQueryLogEnabled()
{
return self::$logQueries;
}
}
......@@ -19,12 +19,21 @@ class DatabaseHandler extends AbstractProcessingHandler
{
protected function write(array $record)
{
$sql = "INSERT INTO " . Common::prefixTable('logger_message')
. " (tag, timestamp, level, message)"
. " VALUES (?, ?, ?, ?)";
$sql = sprintf(
'INSERT INTO %s (tag, timestamp, level, message) VALUES (?, ?, ?, ?)',
Common::prefixTable('logger_message')
);
$message = trim($record['formatted']);
$queryLog = Db::isQueryLogEnabled();
Db::enableQueryLog(false);
Db::query($sql, array($record['extra']['class'], $record['datetime']->format('Y-m-d H:i:s'), $record['level_name'], $message));
Db::query($sql, array(
$record['extra']['class'],
$record['datetime']->format('Y-m-d H:i:s'),
$record['level_name'],
trim($record['formatted'])
));
Db::enableQueryLog($queryLog);
}
}
......@@ -164,6 +164,21 @@ class LogTest extends IntegrationTestCase
$this->checkBackend($backend, self::TESTMESSAGE, $formatMessage = true, $tag);
}
/**
* The database logs requests at DEBUG level, so we check that there is no recursive
* loop (logger insert in databases, which logs the query, ...)
* @link https://github.com/piwik/piwik/issues/7017
*/
public function testNoInfiniteLoopWhenLoggingToDatabase()
{
Config::getInstance()->log['log_writers'] = array('database');
Config::getInstance()->log['log_level'] = 'DEBUG';
Log::info(self::TESTMESSAGE);
$this->checkBackend('database', self::TESTMESSAGE, $formatMessage = true, $tag = __CLASS__);
}
private function checkBackend($backend, $expectedMessage, $formatMessage = false, $tag = false)
{
if ($formatMessage) {
......@@ -178,6 +193,9 @@ class LogTest extends IntegrationTestCase
$this->assertEquals($expectedMessage . "\n", $fileContents);
} else if ($backend == 'database') {
$queryLog = Db::isQueryLogEnabled();
Db::enableQueryLog(false);
$count = Db::fetchOne("SELECT COUNT(*) FROM " . Common::prefixTable('logger_message'));
$this->assertEquals(1, $count);
......@@ -191,6 +209,8 @@ class LogTest extends IntegrationTestCase
} else {
$this->assertEquals($tag, $tagInDb);
}
Db::enableQueryLog($queryLog);
}
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter