From 2eea1d5a42a4b5c455b90a4ed61bf0f9c9296141 Mon Sep 17 00:00:00 2001 From: Bryan Davis Date: Mon, 26 Jan 2015 15:04:12 -0800 Subject: [PATCH] Convert JobRunner to PSR-3 logger * Implement Psr\Log\LoggerAwareInterface * Categorize log events with levels (debug, info, error) Bug: T87521 Change-Id: I2637c40a44e396b1020b76f54c2e8b931f764f02 --- includes/MediaWiki.php | 14 +++++---- includes/jobqueue/JobRunner.php | 46 +++++++++++++++++++++++----- includes/specials/SpecialRunJobs.php | 2 +- maintenance/runJobs.php | 2 +- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index d94443b4b7..431397fb40 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -608,9 +608,11 @@ class MediaWiki { $n = intval( $jobRunRate ); } + $runJobsLogger = MWLoggerFactory::getInstance( 'runJobs' ); + if ( !$this->config->get( 'RunJobsAsync' ) ) { // Fall back to running the job here while the user waits - $runner = new JobRunner(); + $runner = new JobRunner( $runJobsLogger ); $runner->run( array( 'maxJobs' => $n ) ); return; } @@ -643,9 +645,9 @@ class MediaWiki { ); wfRestoreWarnings(); if ( !$sock ) { - wfDebugLog( 'runJobs', "Failed to start cron API (socket error $errno): $errstr\n" ); + $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" ); // Fall back to running the job here while the user waits - $runner = new JobRunner(); + $runner = new JobRunner( $runJobsLogger ); $runner->run( array( 'maxJobs' => $n ) ); return; } @@ -653,19 +655,19 @@ class MediaWiki { $url = wfAppendQuery( wfScript( 'index' ), $query ); $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\nContent-Length: 0\r\n\r\n"; - wfDebugLog( 'runJobs', "Running $n job(s) via '$url'\n" ); + $runJobsLogger->info( "Running $n job(s) via '$url'" ); // Send a cron API request to be performed in the background. // Give up if this takes too long to send (which should be rare). stream_set_timeout( $sock, 1 ); $bytes = fwrite( $sock, $req ); if ( $bytes !== strlen( $req ) ) { - wfDebugLog( 'runJobs', "Failed to start cron API (socket write error)\n" ); + $runJobsLogger->error( "Failed to start cron API (socket write error)" ); } else { // Do not wait for the response (the script should handle client aborts). // Make sure that we don't close before that script reaches ignore_user_abort(). $status = fgets( $sock ); if ( !preg_match( '#^HTTP/\d\.\d 202 #', $status ) ) { - wfDebugLog( 'runJobs', "Failed to start cron API: received '$status'\n" ); + $runJobsLogger->error( "Failed to start cron API: received '$status'" ); } } fclose( $sock ); diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index ef0f087890..091e648d7a 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -21,13 +21,16 @@ * @ingroup JobQueue */ +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerInterface; + /** * Job queue runner utility methods * * @ingroup JobQueue * @since 1.24 */ -class JobRunner { +class JobRunner implements LoggerAwareInterface { /** @var callable|null Debug output handler */ protected $debug; @@ -38,6 +41,28 @@ class JobRunner { $this->debug = $debug; } + /** + * @var LoggerInterface $logger + */ + protected $logger; + + /** + * @param LoggerInterface $logger + */ + public function setLogger( LoggerInterface $logger ) { + $this->logger = $logger; + } + + /** + * @param LoggerInterface $logger + */ + public function __construct( LoggerInterface $logger = null ) { + if ( $logger === null ) { + $logger = MWLoggerFactory::getInstance( 'runJobs' ); + } + $this->setLogger( $logger ); + } + /** * Run jobs of the specified number/type for the specified time * @@ -73,7 +98,9 @@ class JobRunner { // Handle any required periodic queue maintenance $count = $group->executeReadyPeriodicTasks(); if ( $count > 0 ) { - $this->runJobsLog( "Executed $count periodic queue task(s)." ); + $msg = "Executed $count periodic queue task(s)."; + $this->logger->debug( $msg ); + $this->debugCallback( $msg ); } // Bail out if in read-only mode @@ -132,7 +159,9 @@ class JobRunner { $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait ); } - $this->runJobsLog( $job->toString() . " STARTING" ); + $msg = $job->toString() . " STARTING"; + $this->logger->info( $msg ); + $this->debugCallback( $msg ); // Run the job... $jobStartTime = microtime( true ); @@ -164,9 +193,13 @@ class JobRunner { } if ( $status === false ) { - $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" ); + $msg = $job->toString() . " t=$timeMs error={$error}"; + $this->logger->error( $msg ); + $this->debugCallback( $msg ); } else { - $this->runJobsLog( $job->toString() . " t=$timeMs good" ); + $msg = $job->toString() . " t=$timeMs good"; + $this->logger->info( $msg ); + $this->debugCallback( $msg ); } $response['jobs'][] = array( @@ -357,10 +390,9 @@ class JobRunner { * Log the job message * @param string $msg The message to log */ - private function runJobsLog( $msg ) { + private function debugCallback( $msg ) { if ( $this->debug ) { call_user_func_array( $this->debug, array( wfTimestamp( TS_DB ) . " $msg\n" ) ); } - wfDebugLog( 'runJobs', $msg ); } } diff --git a/includes/specials/SpecialRunJobs.php b/includes/specials/SpecialRunJobs.php index d4a06eb5ca..1bafc61601 100644 --- a/includes/specials/SpecialRunJobs.php +++ b/includes/specials/SpecialRunJobs.php @@ -88,7 +88,7 @@ class SpecialRunJobs extends UnlistedSpecialPage { // Do all of the specified tasks... if ( in_array( 'jobs', explode( '|', $params['tasks'] ) ) ) { - $runner = new JobRunner(); + $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) ); $response = $runner->run( array( 'type' => $params['type'], 'maxJobs' => $params['maxjobs'] ? $params['maxjobs'] : 1, diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php index 40605cebae..6abfb66bf3 100644 --- a/maintenance/runJobs.php +++ b/maintenance/runJobs.php @@ -68,7 +68,7 @@ class RunJobs extends Maintenance { $json = ( $this->getOption( 'result' ) === 'json' ); - $runner = new JobRunner(); + $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) ); if ( !$json ) { $runner->setDebugHandler( array( $this, 'debugInternal' ) ); } -- 2.20.1