jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/392411 )
Change subject: More logging
......................................................................
More logging
This adds lots of logging in various places of various levels
for the FileImporter channel.
It also switched from the optional logger interfaces to requiring
one in the constructor for many services.
Each individual import operation now has logging, although
logging within the import done in the WikiRevision class will
go to a different log channel..
It would be great to be able to inject our own log channel here?
or somehow get the logs out for inclusion in our own log channel.
Bug: T180491
Change-Id: I9c5f6d977c62b17c3ef3d92d0d4580e2c1e9fbb3
---
M src/Data/FileRevision.php
M src/Data/ImportOperations.php
M src/Data/TextRevision.php
M src/Operations/FileRevisionFromRemoteUrl.php
M src/Operations/TextRevisionFromTextRevision.php
M src/Remote/MediaWiki/ApiDetailRetriever.php
M src/Remote/MediaWiki/RemoteApiImportTitleChecker.php
M src/Remote/MediaWiki/SiteTableSourceUrlChecker.php
M src/ServiceWiring.php
M src/Services/Importer.php
M src/SpecialImportFile.php
M tests/phpunit/MediaWiki/SiteTableSourceUrlCheckerTest.php
M tests/phpunit/Remote/MediaWiki/ApiDetailRetrieverTest.php
13 files changed, 170 insertions(+), 63 deletions(-)
Approvals:
jenkins-bot: Verified
Andrew-WMDE: Looks good to me, approved
diff --git a/src/Data/FileRevision.php b/src/Data/FileRevision.php
index 098e02e..a53c83c 100644
--- a/src/Data/FileRevision.php
+++ b/src/Data/FileRevision.php
@@ -59,4 +59,11 @@
return $this->fields[$name];
}
+ /**
+ * @return array
+ */
+ public function getFields() {
+ return $this->fields;
+ }
+
}
diff --git a/src/Data/ImportOperations.php b/src/Data/ImportOperations.php
index 0a5e988..cf3029c 100644
--- a/src/Data/ImportOperations.php
+++ b/src/Data/ImportOperations.php
@@ -45,7 +45,6 @@
$this->state = self::PREPARE_RUN;
foreach ( $this->importOperations as $importOperation ) {
if ( !$importOperation->prepare() ) {
- // TODO log?
return false;
}
}
@@ -61,7 +60,6 @@
$this->state = self::COMMIT_RUN;
foreach ( $this->importOperations as $importOperation ) {
if ( !$importOperation->commit() ) {
- // TODO log?
return false;
}
}
diff --git a/src/Data/TextRevision.php b/src/Data/TextRevision.php
index 899bab8..ddb5a69 100644
--- a/src/Data/TextRevision.php
+++ b/src/Data/TextRevision.php
@@ -60,4 +60,11 @@
return $this->fields[$name];
}
+ /**
+ * @return array
+ */
+ public function getFields() {
+ return $this->fields;
+ }
+
}
diff --git a/src/Operations/FileRevisionFromRemoteUrl.php
b/src/Operations/FileRevisionFromRemoteUrl.php
index 24ad537..96e5e75 100644
--- a/src/Operations/FileRevisionFromRemoteUrl.php
+++ b/src/Operations/FileRevisionFromRemoteUrl.php
@@ -8,6 +8,7 @@
use FileImporter\Services\UploadBase\UploadBaseFactory;
use FileImporter\Services\WikiRevisionFactory;
use Http;
+use Psr\Log\LoggerInterface;
use TempFSFile;
use Title;
use WikiRevision;
@@ -40,6 +41,11 @@
private $uploadBaseFactory;
/**
+ * @var LoggerInterface
+ */
+ private $logger;
+
+ /**
* @var WikiRevision|null
*/
private $wikiRevision;
@@ -49,13 +55,15 @@
FileRevision $fileRevision,
HttpRequestExecutor $httpRequestExecutor,
WikiRevisionFactory $wikiRevisionFactory,
- UploadBaseFactory $uploadBaseFactory
+ UploadBaseFactory $uploadBaseFactory,
+ LoggerInterface $logger
) {
$this->plannedTitle = $plannedTitle;
$this->fileRevision = $fileRevision;
$this->httpRequestExecutor = $httpRequestExecutor;
$this->wikiRevisionFactory = $wikiRevisionFactory;
$this->uploadBaseFactory = $uploadBaseFactory;
+ $this->logger = $logger;
}
/**
@@ -87,7 +95,17 @@
$this->plannedTitle,
$this->wikiRevision->getFileSrc()
);
- return $base->validateTitle() === true && $base->validateFile()
=== true;
+
+ $result = $base->validateTitle() === true &&
$base->validateFile() === true;
+
+ if ( !$result ) {
+ $this->logger->error(
+ __METHOD__ . ' failed to prepare.',
+ $this->fileRevision->getFields()
+ );
+ }
+
+ return $result;
}
/**
@@ -95,7 +113,16 @@
* @return bool success
*/
public function commit() {
- return $this->wikiRevision->importUpload();
+ $result = $this->wikiRevision->importUpload();
+
+ if ( !$result ) {
+ $this->logger->error(
+ __METHOD__ . ' failed to commit.',
+ $this->fileRevision->getFields()
+ );
+ }
+
+ return $result;
}
}
diff --git a/src/Operations/TextRevisionFromTextRevision.php
b/src/Operations/TextRevisionFromTextRevision.php
index e1b10b6..8b28862 100644
--- a/src/Operations/TextRevisionFromTextRevision.php
+++ b/src/Operations/TextRevisionFromTextRevision.php
@@ -5,6 +5,7 @@
use FileImporter\Data\TextRevision;
use FileImporter\Interfaces\ImportOperation;
use FileImporter\Services\WikiRevisionFactory;
+use Psr\Log\LoggerInterface;
use Title;
use WikiRevision;
@@ -26,6 +27,11 @@
private $wikiRevisionFactory;
/**
+ * @var LoggerInterface
+ */
+ private $logger;
+
+ /**
* @var WikiRevision|null
*/
private $wikiRevision;
@@ -33,11 +39,13 @@
public function __construct(
Title $plannedTitle,
TextRevision $textRevision,
- WikiRevisionFactory $wikiRevisionFactory
+ WikiRevisionFactory $wikiRevisionFactory,
+ LoggerInterface $logger
) {
$this->plannedTitle = $plannedTitle;
$this->textRevision = $textRevision;
$this->wikiRevisionFactory = $wikiRevisionFactory;
+ $this->logger = $logger;
}
/**
@@ -57,7 +65,16 @@
* @return bool success
*/
public function commit() {
- return $this->wikiRevision->importOldRevision();
+ $result = $this->wikiRevision->importOldRevision();
+
+ if ( !$result ) {
+ $this->logger->error(
+ __METHOD__ . ' failed to commit.',
+ $this->textRevision->getFields()
+ );
+ }
+
+ return $result;
}
}
diff --git a/src/Remote/MediaWiki/ApiDetailRetriever.php
b/src/Remote/MediaWiki/ApiDetailRetriever.php
index 5286b5f..9ed5ebf 100644
--- a/src/Remote/MediaWiki/ApiDetailRetriever.php
+++ b/src/Remote/MediaWiki/ApiDetailRetriever.php
@@ -14,12 +14,10 @@
use FileImporter\Interfaces\DetailRetriever;
use FileImporter\Services\Http\HttpRequestExecutor;
use Message;
-use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
use Title;
-class ApiDetailRetriever implements DetailRetriever, LoggerAwareInterface {
+class ApiDetailRetriever implements DetailRetriever {
const MAX_REVISIONS = 1000;
@@ -40,14 +38,11 @@
public function __construct(
HttpApiLookup $httpApiLookup,
- HttpRequestExecutor $httpRequestExecutor
+ HttpRequestExecutor $httpRequestExecutor,
+ LoggerInterface $logger
) {
$this->httpApiLookup = $httpApiLookup;
$this->httpRequestExecutor = $httpRequestExecutor;
- $this->logger = new NullLogger();
- }
-
- public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
}
diff --git a/src/Remote/MediaWiki/RemoteApiImportTitleChecker.php
b/src/Remote/MediaWiki/RemoteApiImportTitleChecker.php
index 9a6a047..d381d9d 100644
--- a/src/Remote/MediaWiki/RemoteApiImportTitleChecker.php
+++ b/src/Remote/MediaWiki/RemoteApiImportTitleChecker.php
@@ -7,18 +7,22 @@
use FileImporter\Exceptions\ImportException;
use FileImporter\Interfaces\ImportTitleChecker;
use FileImporter\Services\Http\HttpRequestExecutor;
+use Psr\Log\LoggerInterface;
class RemoteApiImportTitleChecker implements ImportTitleChecker {
private $httpApiLookup;
private $httpRequestExecutor;
+ private $logger;
public function __construct(
HttpApiLookup $httpApiLookup,
- HttpRequestExecutor $httpRequestExecutor
+ HttpRequestExecutor $httpRequestExecutor,
+ LoggerInterface $logger
) {
$this->httpApiLookup = $httpApiLookup;
$this->httpRequestExecutor = $httpRequestExecutor;
+ $this->logger = $logger;
}
/**
@@ -35,11 +39,24 @@
try {
$imageInfoRequest =
$this->httpRequestExecutor->execute( $requestUrl );
} catch ( HttpRequestException $e ) {
+ $this->logger->error(
+ __METHOD__ . ' failed to check title state
from: ' . $requestUrl,
+ [
+ 'url' =>
$e->getHttpRequest()->getFinalUrl(),
+ 'content' =>
$e->getHttpRequest()->getContent(),
+ 'errors' =>
$e->getStatusValue()->getErrors(),
+ ]
+ );
throw new ImportException( 'Failed to check title state
from: ' . $requestUrl );
}
$requestData = json_decode( $imageInfoRequest->getContent(),
true );
- return array_key_exists( '-1', $requestData['query']['pages'] );
+ $result = array_key_exists( '-1',
$requestData['query']['pages'] );
+ if ( !$result ) {
+ $this->logger->error( __METHOD__ . ' failed, could not
find pages query key in result.' );
+ }
+
+ return $result;
}
private function getParams( $titleString ) {
diff --git a/src/Remote/MediaWiki/SiteTableSourceUrlChecker.php
b/src/Remote/MediaWiki/SiteTableSourceUrlChecker.php
index c755319..72795ef 100644
--- a/src/Remote/MediaWiki/SiteTableSourceUrlChecker.php
+++ b/src/Remote/MediaWiki/SiteTableSourceUrlChecker.php
@@ -4,6 +4,7 @@
use FileImporter\Data\SourceUrl;
use FileImporter\Interfaces\SourceUrlChecker;
+use Psr\Log\LoggerInterface;
/**
* This SourceUrlChecker implementation will allow files from mediawiki
websites that are contained
@@ -13,15 +14,35 @@
private $siteTableSiteLookup;
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
public function __construct(
- SiteTableSiteLookup $siteTableSiteLookup
+ SiteTableSiteLookup $siteTableSiteLookup,
+ LoggerInterface $logger
) {
$this->siteTableSiteLookup = $siteTableSiteLookup;
+ $this->logger = $logger;
}
public function checkSourceUrl( SourceUrl $sourceUrl ) {
- return $this->siteTableSiteLookup->getSite(
$sourceUrl->getParsedUrl()['host'] ) !== null &&
- $this->getTitleFromSourceUrl( $sourceUrl ) !== null;
+ $site = $this->siteTableSiteLookup->getSite(
$sourceUrl->getParsedUrl()['host'] );
+
+ if ( $site === null ) {
+ $this->logger->error( __METHOD__ . ' failed site check
for URL: ' . $sourceUrl->getUrl() );
+ return false;
+ }
+
+ $titleString = $this->getTitleFromSourceUrl( $sourceUrl );
+
+ if ( $titleString === null ) {
+ $this->logger->error( __METHOD__ . ' failed title check
for URL: ' . $sourceUrl->getUrl() );
+ return false;
+ }
+
+ return true;
}
/**
diff --git a/src/ServiceWiring.php b/src/ServiceWiring.php
index 4de81ae..5acde84 100644
--- a/src/ServiceWiring.php
+++ b/src/ServiceWiring.php
@@ -64,9 +64,9 @@
$importer = new Importer(
$wikiRevisionFactory,
$httpRequestExecutor,
- $uploadBaseFactory
+ $uploadBaseFactory,
+ LoggerFactory::getInstance( 'FileImporter' )
);
- $importer->setLogger( LoggerFactory::getInstance(
'FileImporter' ) );
return $importer;
},
@@ -106,19 +106,19 @@
*/
$httpApiLookup = $services->getService(
'FileImporterMediaWikiHttpApiLookup' );
$httpRequestExecutor = $services->getService(
'FileImporterHttpRequestExecutor' );
-
- $detailRetriever = new Remote\MediaWiki\ApiDetailRetriever(
- $httpApiLookup, $httpRequestExecutor
- );
- $detailRetriever->setLogger( LoggerFactory::getInstance(
'FileImporter' ) );
-
- // TODO ApiImportTitleChecker here should have a logger....
+ $logger = LoggerFactory::getInstance( 'FileImporter' );
$site = new SourceSite(
new AnyMediaWikiFileUrlChecker(),
- $detailRetriever,
+ new Remote\MediaWiki\ApiDetailRetriever(
+ $httpApiLookup,
+ $httpRequestExecutor,
+ $logger
+ ),
new Remote\MediaWiki\RemoteApiImportTitleChecker(
- $httpApiLookup, $httpRequestExecutor
+ $httpApiLookup,
+ $httpRequestExecutor,
+ $logger
),
new SourceUrlNormalizer( function ( SourceUrl
$sourceUrl ) {
return new SourceUrl( str_replace( '..GOAT..',
'', $sourceUrl->getUrl() ) );
@@ -142,20 +142,22 @@
$siteTableLookup = $services->getService(
'FileImporterMediaWikiSiteTableSiteLookup' );
$httpApiLookup = $services->getService(
'FileImporterMediaWikiHttpApiLookup' );
$httpRequestExecutor = $services->getService(
'FileImporterHttpRequestExecutor' );
-
- $detailRetriever = new Remote\MediaWiki\ApiDetailRetriever(
- $httpApiLookup, $httpRequestExecutor
- );
- $detailRetriever->setLogger( LoggerFactory::getInstance(
'FileImporter' ) );
-
- // TODO SiteTableSourceUrlChecker here should have a logger....
- // TODO ApiImportTitleChecker here should have a logger....
+ $logger = LoggerFactory::getInstance( 'FileImporter' );
$site = new SourceSite(
- new SiteTableSourceUrlChecker( $siteTableLookup ),
- $detailRetriever,
+ new SiteTableSourceUrlChecker(
+ $siteTableLookup,
+ $logger
+ ),
+ new Remote\MediaWiki\ApiDetailRetriever(
+ $httpApiLookup,
+ $httpRequestExecutor,
+ $logger
+ ),
new Remote\MediaWiki\RemoteApiImportTitleChecker(
- $httpApiLookup, $httpRequestExecutor
+ $httpApiLookup,
+ $httpRequestExecutor,
+ $logger
),
new SourceUrlNormalizer( function ( SourceUrl
$sourceUrl ) {
return new SourceUrl( str_replace( '.m.', '.',
$sourceUrl->getUrl() ) );
diff --git a/src/Services/Importer.php b/src/Services/Importer.php
index acbc775..da5128e 100644
--- a/src/Services/Importer.php
+++ b/src/Services/Importer.php
@@ -10,9 +10,7 @@
use FileImporter\Operations\TextRevisionFromTextRevision;
use FileImporter\Services\Http\HttpRequestExecutor;
use FileImporter\Services\UploadBase\UploadBaseFactory;
-use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
use RuntimeException;
use Title;
use User;
@@ -21,7 +19,7 @@
/**
* Performs an import of a file to the local wiki based on an ImportPlan
object for a given User.
*/
-class Importer implements LoggerAwareInterface {
+class Importer {
/**
* @var WikiRevisionFactory
@@ -43,23 +41,15 @@
*/
private $logger;
- /**
- * @param WikiRevisionFactory $wikiRevisionFactory
- * @param HttpRequestExecutor $httpRequestExecutor
- * @param UploadBaseFactory $uploadBaseFactory
- */
public function __construct(
WikiRevisionFactory $wikiRevisionFactory,
HttpRequestExecutor $httpRequestExecutor,
- UploadBaseFactory $uploadBaseFactory
+ UploadBaseFactory $uploadBaseFactory,
+ LoggerInterface $logger
) {
$this->wikiRevisionFactory = $wikiRevisionFactory;
$this->httpRequestExecutor = $httpRequestExecutor;
$this->uploadBaseFactory = $uploadBaseFactory;
- $this->logger = new NullLogger();
- }
-
- public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
}
@@ -80,6 +70,8 @@
// TODO the type of ImportOperation created should be decided
somewhere
+ $this->logger->info( __METHOD__ . ' started' );
+
/**
* Text revisions should be added first. See T147451.
* This ensures that the page entry is created and if something
fails it can thus be deleted.
@@ -88,7 +80,8 @@
$importOperations->add( new
TextRevisionFromTextRevision(
$plannedTitle,
$textRevision,
- $this->wikiRevisionFactory
+ $this->wikiRevisionFactory,
+ $this->logger
) );
}
@@ -98,19 +91,24 @@
$fileRevision,
$this->httpRequestExecutor,
$this->wikiRevisionFactory,
- $this->uploadBaseFactory
+ $this->uploadBaseFactory,
+ $this->logger
) );
}
+ $this->logger->info( __METHOD__ . ' ImportOperations built.' );
+
if ( !$importOperations->prepare() ) {
- $this->logger->error( 'Failed to prepare operations.' );
+ $this->logger->error( __METHOD__ . 'Failed to prepare
operations.' );
throw new RuntimeException( 'Failed to prepare
operations.' );
}
+ $this->logger->info( __METHOD__ . ' operations prepared.' );
if ( !$importOperations->commit() ) {
- $this->logger->error( 'Failed to commit operations.' );
+ $this->logger->error( __METHOD__ . 'Failed to commit
operations.' );
throw new RuntimeException( 'Failed to commit
operations.' );
}
+ $this->logger->info( __METHOD__ . ' operations committed.' );
// TODO the below should be an ImportOperation
$articleIdForUpdate = $this->getArticleIdForUpdate( $importPlan
);
@@ -165,7 +163,8 @@
);
if ( !$editResult->isOK() ) {
- throw new RuntimeException( 'Failed to create import
edit' );
+ $this->logger->error( __METHOD__ . ' Failed to create
import revision.' );
+ throw new RuntimeException( 'Failed to create import
revision' );
}
}
@@ -189,6 +188,7 @@
);
if ( !$editResult->isOK() ) {
+ $this->logger->error( __METHOD__ . ' Failed to create
user edit.' );
throw new RuntimeException( 'Failed to create user
edit' );
}
}
diff --git a/src/SpecialImportFile.php b/src/SpecialImportFile.php
index 193cd22..53827d3 100644
--- a/src/SpecialImportFile.php
+++ b/src/SpecialImportFile.php
@@ -22,9 +22,11 @@
use FileImporter\Services\SourceSiteLocator;
use Html;
use ILocalizedException;
+use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use Message;
use PermissionsError;
+use Psr\Log\LoggerInterface;
use SpecialPage;
use UploadBase;
use User;
@@ -47,6 +49,11 @@
*/
private $importPlanFactory;
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
private $config;
public function __construct() {
@@ -63,6 +70,7 @@
$this->sourceSiteLocator = $services->getService(
'FileImporterSourceSiteLocator' );
$this->importer = $services->getService( 'FileImporterImporter'
);
$this->importPlanFactory = $services->getService(
'FileImporterImportPlanFactory' );
+ $this->logger = LoggerFactory::getInstance( 'FileImporter' );
}
public function getGroupName() {
@@ -121,9 +129,12 @@
return;
}
+ $clientUrl = $this->getRequest()->getVal( 'clientUrl' );
try {
+ $this->logger->info( 'Getting ImportPlan for URL: ' .
$clientUrl );
$importPlan = $this->getImportPlan();
} catch ( ImportException $exception ) {
+ $this->logger->info( 'ImportException: ' .
$exception->getMessage() );
$this->handleImportException( $exception );
return;
}
diff --git a/tests/phpunit/MediaWiki/SiteTableSourceUrlCheckerTest.php
b/tests/phpunit/MediaWiki/SiteTableSourceUrlCheckerTest.php
index 7a77924..3b0cdd3 100644
--- a/tests/phpunit/MediaWiki/SiteTableSourceUrlCheckerTest.php
+++ b/tests/phpunit/MediaWiki/SiteTableSourceUrlCheckerTest.php
@@ -7,6 +7,7 @@
use FileImporter\Remote\MediaWiki\SiteTableSourceUrlChecker;
use HashSiteStore;
use PHPUnit_Framework_TestCase;
+use Psr\Log\NullLogger;
use Site;
class SiteTableSourceUrlCheckerTest extends PHPUnit_Framework_TestCase {
@@ -21,7 +22,8 @@
}
return new SiteTableSourceUrlChecker(
- new SiteTableSiteLookup( new HashSiteStore( $sites ) )
+ new SiteTableSiteLookup( new HashSiteStore( $sites ) ),
+ new NullLogger()
);
}
diff --git a/tests/phpunit/Remote/MediaWiki/ApiDetailRetrieverTest.php
b/tests/phpunit/Remote/MediaWiki/ApiDetailRetrieverTest.php
index 4ffe2df..8156ad3 100644
--- a/tests/phpunit/Remote/MediaWiki/ApiDetailRetrieverTest.php
+++ b/tests/phpunit/Remote/MediaWiki/ApiDetailRetrieverTest.php
@@ -10,6 +10,7 @@
use MWHttpRequest;
use PHPUnit_Framework_TestCase;
use Exception;
+use Psr\Log\NullLogger;
class ApiDetailRetrieverTest extends PHPUnit_Framework_TestCase {
@@ -36,7 +37,8 @@
public function testInvalidResponse( $content, Exception $expected ) {
$service = new ApiDetailRetriever(
$this->getMockHttpApiLookup(),
- $this->getMockHttpRequestExecutor( 'File:Foo.jpg',
json_encode( $content ) )
+ $this->getMockHttpRequestExecutor( 'File:Foo.jpg',
json_encode( $content ) ),
+ new NullLogger()
);
$this->setExpectedException( get_class( $expected ),
$expected->getMessage() );
@@ -113,7 +115,8 @@
public function testValidResponse( $sourceUrl, $titleString, $content,
$expected ) {
$service = new ApiDetailRetriever(
$this->getMockHttpApiLookup(),
- $this->getMockHttpRequestExecutor( $titleString,
$content )
+ $this->getMockHttpRequestExecutor( $titleString,
$content ),
+ new NullLogger()
);
$importDetails = $service->getImportDetails( $sourceUrl );
--
To view, visit https://gerrit.wikimedia.org/r/392411
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I9c5f6d977c62b17c3ef3d92d0d4580e2c1e9fbb3
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/extensions/FileImporter
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: Addshore <[email protected]>
Gerrit-Reviewer: Andrew-WMDE <[email protected]>
Gerrit-Reviewer: Reedy <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: WMDE-Fisch <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits