Implicitly marking parameter $... as nullable is deprecated in php8.4, the explicit nullable type must be used instead Created with autofix from Ide15839e98a6229c22584d1c1c88c690982e1d7a Break one long line in SpecialPage.php Bug: T376276 Change-Id: I807257b2ba1ab2744ab74d9572c9c3d3ac2a968e
105 lines
2.4 KiB
PHP
105 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Logger;
|
|
|
|
use Psr\Log\AbstractLogger;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
/**
|
|
* Wrap another Spi and keep a copy of all log messages.
|
|
*
|
|
* This is developed for use by PHPUnit bootstrapping, to collect logs
|
|
* generated during a given unit test, and print them after a failing test.
|
|
*
|
|
* @internal For use in MediaWiki core only
|
|
* @ingroup Debug
|
|
*/
|
|
class LogCapturingSpi implements Spi {
|
|
/** @var LoggerInterface[] */
|
|
private $singletons;
|
|
/** @var Spi */
|
|
private $inner;
|
|
/** @var array */
|
|
private $logs = [];
|
|
|
|
public function __construct( Spi $inner ) {
|
|
$this->inner = $inner;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getLogs() {
|
|
return $this->logs;
|
|
}
|
|
|
|
/**
|
|
* @param string $channel
|
|
* @return LoggerInterface
|
|
*/
|
|
public function getLogger( $channel ) {
|
|
if ( !isset( $this->singletons[$channel] ) ) {
|
|
$this->singletons[$channel] = $this->createLogger( $channel );
|
|
}
|
|
return $this->singletons[$channel];
|
|
}
|
|
|
|
/**
|
|
* @param array $log
|
|
*/
|
|
public function capture( $log ) {
|
|
$this->logs[] = $log;
|
|
}
|
|
|
|
/**
|
|
* @param string $channel
|
|
* @return LoggerInterface
|
|
*/
|
|
private function createLogger( $channel ) {
|
|
$inner = $this->inner->getLogger( $channel );
|
|
return new class( $channel, $inner, $this ) extends AbstractLogger {
|
|
/** @var string */
|
|
private $channel;
|
|
/** @var LoggerInterface */
|
|
private $logger;
|
|
/** @var LogCapturingSpi */
|
|
private $parent;
|
|
|
|
public function __construct( $channel, LoggerInterface $logger, LogCapturingSpi $parent ) {
|
|
$this->channel = $channel;
|
|
$this->logger = $logger;
|
|
$this->parent = $parent;
|
|
}
|
|
|
|
public function log( $level, $message, array $context = [] ) {
|
|
$this->parent->capture( [
|
|
'channel' => $this->channel,
|
|
'level' => $level,
|
|
'message' => $message,
|
|
'context' => $context
|
|
] );
|
|
$this->logger->log( $level, $message, $context );
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @internal For use by MediaWikiIntegrationTestCase
|
|
* @return Spi
|
|
*/
|
|
public function getInnerSpi(): Spi {
|
|
return $this->inner;
|
|
}
|
|
|
|
/**
|
|
* @internal For use by MediaWikiIntegrationTestCase
|
|
* @param string $channel
|
|
* @param LoggerInterface|null $logger
|
|
* @return LoggerInterface|null
|
|
*/
|
|
public function setLoggerForTest( $channel, ?LoggerInterface $logger = null ) {
|
|
$ret = $this->singletons[$channel] ?? null;
|
|
$this->singletons[$channel] = $logger;
|
|
return $ret;
|
|
}
|
|
}
|