Convert JobRunner to PSR-3 logger
authorBryan Davis <bd808@wikimedia.org>
Mon, 26 Jan 2015 23:04:12 +0000 (15:04 -0800)
committerBryan Davis <bd808@wikimedia.org>
Mon, 26 Jan 2015 23:04:12 +0000 (15:04 -0800)
* Implement Psr\Log\LoggerAwareInterface
* Categorize log events with levels (debug, info, error)

Bug: T87521
Change-Id: I2637c40a44e396b1020b76f54c2e8b931f764f02

includes/MediaWiki.php
includes/jobqueue/JobRunner.php
includes/specials/SpecialRunJobs.php
maintenance/runJobs.php

index d94443b..431397f 100644 (file)
@@ -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 );
index ef0f087..091e648 100644 (file)
  * @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 );
        }
 }
index d4a06eb..1bafc61 100644 (file)
@@ -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,
index 40605ce..6abfb66 100644 (file)
@@ -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' ) );
                }