Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
LoggerFactory
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 6
72
0.00% covered (danger)
0.00%
0 / 1
 registerProvider
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getProvider
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
 getInstance
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getContext
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 setContext
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\Logger;
8
9use LogicException;
10use Wikimedia\ObjectFactory\ObjectFactory;
11
12/**
13 * Create PSR-3 logger objects.
14 *
15 * Creation of \Psr\Log\LoggerInterface instances is managed via the
16 * LoggerFactory::getInstance() static method which in turn delegates to the
17 * currently registered service provider.
18 *
19 * A service provider is any class implementing the Spi interface.
20 * There are two possible methods of registering a service provider. The
21 * LoggerFactory::registerProvider() static method can be called at any time
22 * to change the service provider. If LoggerFactory::getInstance() is called
23 * before any service provider has been registered, it will attempt to use the
24 * $wgMWLoggerDefaultSpi global to bootstrap Spi registration.
25 * $wgMWLoggerDefaultSpi is expected to be an array usable by
26 * ObjectFactory::getObjectFromSpec() to create a class.
27 *
28 * @since 1.25
29 * @ingroup Debug
30 * @copyright © 2014 Wikimedia Foundation and contributors
31 */
32class LoggerFactory {
33
34    /**
35     * Service provider.
36     * @var \MediaWiki\Logger\Spi
37     */
38    private static $spi;
39
40    private static ?LoggingContext $context;
41
42    /**
43     * Register a service provider to create new \Psr\Log\LoggerInterface
44     * instances.
45     *
46     * @param \MediaWiki\Logger\Spi $provider Provider to register
47     */
48    public static function registerProvider( Spi $provider ) {
49        self::$spi = $provider;
50    }
51
52    /**
53     * Get the registered service provider.
54     *
55     * If called before any service provider has been registered, it will
56     * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
57     * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
58     * array usable by ObjectFactory::getObjectFromSpec() to create a class.
59     *
60     * @return \MediaWiki\Logger\Spi
61     * @see registerProvider()
62     * @see ObjectFactory::getObjectFromSpec()
63     */
64    public static function getProvider() {
65        if ( self::$spi === null ) {
66            global $wgMWLoggerDefaultSpi;
67            $provider = ObjectFactory::getObjectFromSpec(
68                $wgMWLoggerDefaultSpi
69            );
70            self::registerProvider( $provider );
71        }
72        return self::$spi;
73    }
74
75    /**
76     * Get a named logger instance from the currently configured logger factory.
77     *
78     * @param string $channel Logger channel (name)
79     * @return \Psr\Log\LoggerInterface
80     */
81    public static function getInstance( $channel ) {
82        return self::getProvider()->getLogger( $channel );
83    }
84
85    /**
86     * Get a logging context, which can be used to add information to all log events.
87     * @since 1.44
88     */
89    public static function getContext(): LoggingContext {
90        self::$context ??= new LoggingContext();
91        return self::$context;
92    }
93
94    /**
95     * Replace the logging context, for testing.
96     * Can also be used to reset the context between tests, by passing new LoggingContext().
97     * @internal Should only be used by PHPUnit and parser tests.
98     */
99    public static function setContext( LoggingContext $context ): void {
100        if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
101            throw new LogicException( __METHOD__ . ' can only be used in PHPUnit tests' );
102        }
103        self::$context = $context;
104    }
105
106    /**
107     * Construction of utility class is not allowed.
108     */
109    private function __construct() {
110        // no-op
111    }
112}