wiki.techinc.nl/includes/debug/logger/Logger.php
Bryan Davis ed6af3296e die() with explanation when \Psr\Log\LoggerInterface is missing
Add an explicit check for the \Psr\Log\LoggerInterface in the source
file that declares MWLogger and `die()` with an explanation and links to
documentation if the interface is not present.

MediaWiki requires the PSR-3 logging library to be present in the PHP
search path or via an autoloader after I1e5596d. The composer.json for
MediaWiki requires the necessary library, but usage of Composer with
MediaWiki is not wide spread yet and users may be caught unaware by the
new dependency. The default log messages generated when PHP fails to
load the required interfaces and classes are not instructive as to how
to correct the problem.

Bug: 72777
Change-Id: I3db489702ed5d7973c6b5963eac22f181ca28c72
2014-11-03 09:16:35 -07:00

221 lines
6 KiB
PHP

<?php
/**
* @section LICENSE
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
$message = <<<TXT
MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging library</a> to be present. This library is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
TXT;
echo $message;
trigger_error( $message, E_USER_ERROR );
die( 1 );
}
/**
* PSR-3 logging service.
*
* This class provides a service interface for logging system events. The
* MWLogger class itself is intended to be a thin wrapper around another PSR-3
* compliant logging library. Creation of MWLogger instances is managed via
* the MWLogger::getInstance() static method which in turn delegates to the
* currently registered service provider.
*
* A service provider is any class implementing the MWLoggerSpi interface.
* There are two possible methods of registering a service provider. The
* MWLogger::registerProvider() static method can be called at any time to
* change the service provider. If MWLogger::getInstance() is called before
* any service provider has been registered, it will attempt to use the
* $wgMWLoggerDefaultSpi global to bootstrap MWLoggerSpi registration.
* $wgMWLoggerDefaultSpi can either be the name of a class implementing the
* MWLoggerSpi interface with a zero argument constructor or a callable that
* will return an MWLoggerSpi instance.
*
* @see MWLoggerSpi
* @since 1.25
* @author Bryan Davis <bd808@wikimedia.org>
* @copyright © 2014 Bryan Davis and Wikimedia Foundation.
*/
class MWLogger implements \Psr\Log\LoggerInterface {
/**
* Service provider.
* @var MWLoggerSpi $spi
*/
protected static $spi;
/**
* Wrapped PSR-3 logger instance.
*
* @var \Psr\Log\LoggerInterface $delegate
*/
protected $delegate;
/**
* @param \Psr\Log\LoggerInterface $logger
*/
public function __construct( \Psr\Log\LoggerInterface $logger ) {
$this->delegate = $logger;
}
/**
* Logs with an arbitrary level.
*
* @param string|int $level
* @param string $message
* @param array $context
*/
public function log( $level, $message, array $context = array() ) {
$this->delegate->log( $level, $message, $context );
}
/**
* System is unusable.
*
* @param string $message
* @param array $context
*/
public function emergency( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::EMERGENCY, $message, $context );
}
/**
* Action must be taken immediately.
*
* Example: Entire website down, database unavailable, etc. This should
* trigger the SMS alerts and wake you up.
*
* @param string $message
* @param array $context
*/
public function alert( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::ALERT, $message, $context );
}
/**
* Critical conditions.
*
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
* @param array $context
*/
public function critical( $message, array $context = array( ) ) {
$this->log( \Psr\Log\LogLevel::CRITICAL, $message, $context );
}
/**
* Runtime errors that do not require immediate action but should typically
* be logged and monitored.
*
* @param string $message
* @param array $context
*/
public function error( $message, array $context = array( ) ) {
$this->log( \Psr\Log\LogLevel::ERROR, $message, $context );
}
/**
* Exceptional occurrences that are not errors.
*
* Example: Use of deprecated APIs, poor use of an API, undesirable things
* that are not necessarily wrong.
*
* @param string $message
* @param array $context
*/
public function warning( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::WARNING, $message, $context );
}
/**
* Normal but significant events.
*
* @param string $message
* @param array $context
*/
public function notice( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::NOTICE, $message, $context );
}
/**
* Interesting events.
*
* Example: User logs in, SQL logs.
*
* @param string $message
* @param array $context
*/
public function info( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::INFO, $message, $context );
}
/**
* Detailed debug information.
*
* @param string $message
* @param array $context
*/
public function debug( $message, array $context = array() ) {
$this->log( \Psr\Log\LogLevel::DEBUG, $message, $context );
}
/**
* Register a service provider to create new MWLogger instances.
*
* @param MWLoggerSpi $provider Provider to register
*/
public static function registerProvider( MWLoggerSpi $provider ) {
self::$spi = $provider;
}
/**
* Get a named logger instance from the currently configured logger factory.
*
* @param string $channel Logger channel (name)
* @return MWLogger
*/
public static function getInstance( $channel ) {
if ( self::$spi === null ) {
global $wgMWLoggerDefaultSpi;
$provider = ObjectFactory::getObjectFromSpec(
$wgMWLoggerDefaultSpi
);
self::registerProvider( $provider );
}
return self::$spi->getLogger( $channel );
}
}