%PDF- %PDF-
Direktori : /data/www_bck/varak.net_bck/havranipapuce.varak.net/includes/debug/logger/ |
Current File : //data/www_bck/varak.net_bck/havranipapuce.varak.net/includes/debug/logger/MonologSpi.php |
<?php /** * 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 */ namespace MediaWiki\Logger; use Monolog\Logger; use ObjectFactory; /** * LoggerFactory service provider that creates loggers implemented by * Monolog. * * Configured using an array of configuration data with the keys 'loggers', * 'processors', 'handlers' and 'formatters'. * * The ['loggers']['@default'] configuration will be used to create loggers * for any channel that isn't explicitly named in the 'loggers' configuration * section. * * Configuration will most typically be provided in the $wgMWLoggerDefaultSpi * global configuration variable used by LoggerFactory to construct its * default SPI provider: * @code * $wgMWLoggerDefaultSpi = array( * 'class' => '\\MediaWiki\\Logger\\MonologSpi', * 'args' => array( array( * 'loggers' => array( * '@default' => array( * 'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ), * 'handlers' => array( 'stream' ), * ), * 'runJobs' => array( * 'processors' => array( 'wiki', 'psr', 'pid' ), * 'handlers' => array( 'stream' ), * ) * ), * 'processors' => array( * 'wiki' => array( * 'class' => '\\MediaWiki\\Logger\\Monolog\\WikiProcessor', * ), * 'psr' => array( * 'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor', * ), * 'pid' => array( * 'class' => '\\Monolog\\Processor\\ProcessIdProcessor', * ), * 'uid' => array( * 'class' => '\\Monolog\\Processor\\UidProcessor', * ), * 'web' => array( * 'class' => '\\Monolog\\Processor\\WebProcessor', * ), * ), * 'handlers' => array( * 'stream' => array( * 'class' => '\\Monolog\\Handler\\StreamHandler', * 'args' => array( 'path/to/your.log' ), * 'formatter' => 'line', * ), * 'redis' => array( * 'class' => '\\Monolog\\Handler\\RedisHandler', * 'args' => array( function() { * $redis = new Redis(); * $redis->connect( '127.0.0.1', 6379 ); * return $redis; * }, * 'logstash' * ), * 'formatter' => 'logstash', * ), * 'udp2log' => array( * 'class' => '\\MediaWiki\\Logger\\Monolog\\LegacyHandler', * 'args' => array( * 'udp://127.0.0.1:8420/mediawiki * ), * 'formatter' => 'line', * ), * ), * 'formatters' => array( * 'line' => array( * 'class' => '\\Monolog\\Formatter\\LineFormatter', * ), * 'logstash' => array( * 'class' => '\\Monolog\\Formatter\\LogstashFormatter', * 'args' => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ), * ), * ), * ) ), * ); * @endcode * * @see https://github.com/Seldaek/monolog * @since 1.25 * @author Bryan Davis <bd808@wikimedia.org> * @copyright © 2014 Bryan Davis and Wikimedia Foundation. */ class MonologSpi implements Spi { /** * @var array $singletons */ protected $singletons; /** * Configuration for creating new loggers. * @var array $config */ protected $config; /** * @param array $config Configuration data. */ public function __construct( array $config ) { $this->config = $config; $this->reset(); } /** * Reset internal caches. * * This is public for use in unit tests. Under normal operation there should * be no need to flush the caches. */ public function reset() { $this->singletons = array( 'loggers' => array(), 'handlers' => array(), 'formatters' => array(), 'processors' => array(), ); } /** * Get a logger instance. * * Creates and caches a logger instance based on configuration found in the * $wgMWLoggerMonologSpiConfig global. Subsequent request for the same channel * name will return the cached instance. * * @param string $channel Logging channel * @return \Psr\Log\LoggerInterface Logger instance */ public function getLogger( $channel ) { if ( !isset( $this->singletons['loggers'][$channel] ) ) { // Fallback to using the '@default' configuration if an explict // configuration for the requested channel isn't found. $spec = isset( $this->config['loggers'][$channel] ) ? $this->config['loggers'][$channel] : $this->config['loggers']['@default']; $monolog = $this->createLogger( $channel, $spec ); $this->singletons['loggers'][$channel] = $monolog; } return $this->singletons['loggers'][$channel]; } /** * Create a logger. * @param string $channel Logger channel * @param array $spec Configuration * @return \Monolog\Logger */ protected function createLogger( $channel, $spec ) { $obj = new Logger( $channel ); if ( isset( $spec['processors'] ) ) { foreach ( $spec['processors'] as $processor ) { $obj->pushProcessor( $this->getProcessor( $processor ) ); } } if ( isset( $spec['handlers'] ) ) { foreach ( $spec['handlers'] as $handler ) { $obj->pushHandler( $this->getHandler( $handler ) ); } } return $obj; } /** * Create or return cached processor. * @param string $name Processor name * @return callable */ public function getProcessor( $name ) { if ( !isset( $this->singletons['processors'][$name] ) ) { $spec = $this->config['processors'][$name]; $processor = ObjectFactory::getObjectFromSpec( $spec ); $this->singletons['processors'][$name] = $processor; } return $this->singletons['processors'][$name]; } /** * Create or return cached handler. * @param string $name Processor name * @return \Monolog\Handler\HandlerInterface */ public function getHandler( $name ) { if ( !isset( $this->singletons['handlers'][$name] ) ) { $spec = $this->config['handlers'][$name]; $handler = ObjectFactory::getObjectFromSpec( $spec ); if ( isset( $spec['formatter'] ) ) { $handler->setFormatter( $this->getFormatter( $spec['formatter'] ) ); } $this->singletons['handlers'][$name] = $handler; } return $this->singletons['handlers'][$name]; } /** * Create or return cached formatter. * @param string $name Formatter name * @return \Monolog\Formatter\FormatterInterface */ public function getFormatter( $name ) { if ( !isset( $this->singletons['formatters'][$name] ) ) { $spec = $this->config['formatters'][$name]; $formatter = ObjectFactory::getObjectFromSpec( $spec ); $this->singletons['formatters'][$name] = $formatter; } return $this->singletons['formatters'][$name]; } }