From 81e8d7af4129eb5623d6042c419d29959ca50628 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 16 Sep 2016 13:57:56 -0700 Subject: [PATCH] Avoid MWDebug usage in DatabaseBase This class is in /libs and cannot depend on all of MediaWiki. Replace the call with a simple debug() call instead. Also, make the legacy logger route/format errors from the two new DB log types (DBConnection, DBQuery) to the old wfLogDBError locations, including MWDebug::debugMsg(). Change-Id: I64895d3f5b9a000d8186ab6a6ffb4b76a7e9ff40 --- includes/db/loadbalancer/LBFactoryMW.php | 4 +-- includes/debug/logger/LegacyLogger.php | 33 ++++++++++++++++--- includes/libs/rdbms/database/Database.php | 6 +++- .../includes/db/DatabaseTestHelper.php | 2 ++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/includes/db/loadbalancer/LBFactoryMW.php b/includes/db/loadbalancer/LBFactoryMW.php index 69fd21dc16..f4d17773a3 100644 --- a/includes/db/loadbalancer/LBFactoryMW.php +++ b/includes/db/loadbalancer/LBFactoryMW.php @@ -52,8 +52,8 @@ abstract class LBFactoryMW extends LBFactory { 'profiler' => Profiler::instance(), 'trxProfiler' => Profiler::instance()->getTransactionProfiler(), 'replLogger' => LoggerFactory::getInstance( 'DBReplication' ), - 'queryLogger' => LoggerFactory::getInstance( 'wfLogDBError' ), - 'connLogger' => LoggerFactory::getInstance( 'wfLogDBError' ), + 'queryLogger' => LoggerFactory::getInstance( 'DBQuery' ), + 'connLogger' => LoggerFactory::getInstance( 'DBConnection' ), 'perfLogger' => LoggerFactory::getInstance( 'DBPerformance' ), 'errorLogger' => [ MWExceptionHandler::class, 'logException' ], 'cliMode' => $wgCommandLineMode, diff --git a/includes/debug/logger/LegacyLogger.php b/includes/debug/logger/LegacyLogger.php index 526b4ab03b..ef7a994c9e 100644 --- a/includes/debug/logger/LegacyLogger.php +++ b/includes/debug/logger/LegacyLogger.php @@ -70,6 +70,14 @@ class LegacyLogger extends AbstractLogger { LogLevel::EMERGENCY => 600, ]; + /** + * @var array + */ + protected static $dbChannels = [ + 'DBQuery' => true, + 'DBConnection' => true + ]; + /** * @param string $channel */ @@ -83,14 +91,29 @@ class LegacyLogger extends AbstractLogger { * @param string|int $level * @param string $message * @param array $context + * @return null */ public function log( $level, $message, array $context = [] ) { - if ( self::shouldEmit( $this->channel, $message, $level, $context ) ) { - $text = self::format( $this->channel, $message, $context ); - $destination = self::destination( $this->channel, $message, $context ); + if ( isset( self::$dbChannels[$this->channel] ) + && isset( self::$levelMapping[$level] ) + && self::$levelMapping[$level] >= LogLevel::ERROR + ) { + // Format and write DB errors to the legacy locations + $effectiveChannel = 'wfLogDBError'; + } else { + $effectiveChannel = $this->channel; + } + + if ( self::shouldEmit( $effectiveChannel, $message, $level, $context ) ) { + $text = self::format( $effectiveChannel, $message, $context ); + $destination = self::destination( $effectiveChannel, $message, $context ); self::emit( $text, $destination ); } - if ( !isset( $context['private'] ) || !$context['private'] ) { + if ( $this->channel === 'DBQuery' && isset( $context['method'] ) + && isset( $context['master'] ) && isset( $context['runtime'] ) + ) { + MWDebug::query( $message, $context['method'], $context['master'], $context['runtime'] ); + } elseif ( !isset( $context['private'] ) || !$context['private'] ) { // Add to debug toolbar if not marked as "private" MWDebug::debugMsg( $message, [ 'channel' => $this->channel ] + $context ); } @@ -298,6 +321,7 @@ class LegacyLogger extends AbstractLogger { * @param string $channel * @param string $message * @param array $context + * @return null */ protected static function formatAsWfDebugLog( $channel, $message, $context ) { $time = wfTimestamp( TS_DB ); @@ -432,7 +456,6 @@ class LegacyLogger extends AbstractLogger { * * @param string $text * @param string $file Filename - * @throws MWException */ public static function emit( $text, $file ) { if ( substr( $file, 0, 4 ) == 'udp:' ) { diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index de0de6e59f..1c2c0bd3a9 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -903,7 +903,11 @@ abstract class Database implements IDatabase, LoggerAwareInterface { $this->trxProfiler->recordQueryCompletion( $queryProf, $startTime, $isWrite, $this->affectedRows() ); - MWDebug::query( $sql, $fname, $isMaster, $queryRuntime ); + $this->queryLogger->debug( $sql, [ + 'method' => $fname, + 'master' => $isMaster, + 'runtime' => $queryRuntime, + ] ); return $ret; } diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php index 63322cc9a2..caa29bd448 100644 --- a/tests/phpunit/includes/db/DatabaseTestHelper.php +++ b/tests/phpunit/includes/db/DatabaseTestHelper.php @@ -34,6 +34,8 @@ class DatabaseTestHelper extends DatabaseBase { $this->profiler = new ProfilerStub( [] ); $this->trxProfiler = new TransactionProfiler(); $this->cliMode = isset( $opts['cliMode'] ) ? $opts['cliMode'] : true; + $this->connLogger = new \Psr\Log\NullLogger(); + $this->queryLogger = new \Psr\Log\NullLogger(); } /** -- 2.20.1