class LoggerChannel

Same name in other branches
  1. 9 core/lib/Drupal/Core/Logger/LoggerChannel.php \Drupal\Core\Logger\LoggerChannel
  2. 8.9.x core/lib/Drupal/Core/Logger/LoggerChannel.php \Drupal\Core\Logger\LoggerChannel
  3. 10 core/lib/Drupal/Core/Logger/LoggerChannel.php \Drupal\Core\Logger\LoggerChannel

Defines a logger channel that most implementations will use.

Hierarchy

Expanded class hierarchy of LoggerChannel

2 files declare their use of LoggerChannel
LoggerChannelTest.php in core/tests/Drupal/Tests/Core/Logger/LoggerChannelTest.php
TestSystemLoggerChannel.php in core/modules/system/tests/modules/advisory_feed_test/src/TestSystemLoggerChannel.php
1 string reference to 'LoggerChannel'
contact.services.yml in core/modules/contact/contact.services.yml
core/modules/contact/contact.services.yml
1 service uses LoggerChannel
logger.channel.contact in core/modules/contact/contact.services.yml
Drupal\Core\Logger\LoggerChannel

File

core/lib/Drupal/Core/Logger/LoggerChannel.php, line 14

Namespace

Drupal\Core\Logger
View source
class LoggerChannel implements LoggerChannelInterface {
    use LoggerTrait;
    
    /**
     * Maximum call depth to self::log() for a single log message.
     *
     * It's very easy for logging channel code to call out to other library code
     * that will create log messages. In that case, we will recurse back in to
     * LoggerChannel::log() multiple times while processing a single originating
     * message. To prevent infinite recursion, we track the call depth and bail
     * out at LoggerChannel::MAX_CALL_DEPTH iterations.
     *
     * @var int
     */
    const MAX_CALL_DEPTH = 5;
    
    /**
     * Number of times LoggerChannel::log() has been called for a single message.
     *
     * @var int
     */
    protected $callDepth = 0;
    
    /**
     * The name of the channel of this logger instance.
     *
     * @var string
     */
    protected $channel;
    
    /**
     * Map of PSR3 log constants to RFC 5424 log constants.
     *
     * @var array
     */
    protected $levelTranslation = [
        LogLevel::EMERGENCY => RfcLogLevel::EMERGENCY,
        LogLevel::ALERT => RfcLogLevel::ALERT,
        LogLevel::CRITICAL => RfcLogLevel::CRITICAL,
        LogLevel::ERROR => RfcLogLevel::ERROR,
        LogLevel::WARNING => RfcLogLevel::WARNING,
        LogLevel::NOTICE => RfcLogLevel::NOTICE,
        LogLevel::INFO => RfcLogLevel::INFO,
        LogLevel::DEBUG => RfcLogLevel::DEBUG,
    ];
    
    /**
     * An array of arrays of \Psr\Log\LoggerInterface keyed by priority.
     *
     * @var array
     */
    protected $loggers = [];
    
    /**
     * The request stack object.
     *
     * @var \Symfony\Component\HttpFoundation\RequestStack
     */
    protected $requestStack;
    
    /**
     * The current user object.
     *
     * @var \Drupal\Core\Session\AccountInterface
     */
    protected $currentUser;
    
    /**
     * Constructs a LoggerChannel object.
     *
     * @param string $channel
     *   The channel name for this instance.
     */
    public function __construct($channel) {
        $this->channel = $channel;
    }
    
    /**
     * {@inheritdoc}
     */
    public function log($level, string|\Stringable $message, array $context = []) : void {
        if ($this->callDepth == self::MAX_CALL_DEPTH) {
            return;
        }
        $this->callDepth++;
        // Merge in defaults.
        $context += [
            'channel' => $this->channel,
            'link' => '',
            'uid' => 0,
            'request_uri' => '',
            'referer' => '',
            'ip' => '',
            'timestamp' => time(),
        ];
        // Some context values are only available when in a request context.
        if ($this->requestStack && ($request = $this->requestStack
            ->getCurrentRequest())) {
            $context['request_uri'] = $request->getUri();
            $context['referer'] = $request->headers
                ->get('Referer', '');
            $context['ip'] = $request->getClientIP() ?: '';
            if ($this->currentUser) {
                $context['uid'] = $this->currentUser
                    ->id();
            }
        }
        if (is_string($level)) {
            // Convert to integer equivalent for consistency with RFC 5424.
            $level = $this->levelTranslation[$level];
        }
        // Call all available loggers.
        foreach ($this->sortLoggers() as $logger) {
            $logger->log($level, $message, $context);
        }
        $this->callDepth--;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setRequestStack(?RequestStack $requestStack = NULL) {
        $this->requestStack = $requestStack;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setCurrentUser(?AccountInterface $current_user = NULL) {
        $this->currentUser = $current_user;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setLoggers(array $loggers) {
        $this->loggers = $loggers;
    }
    
    /**
     * {@inheritdoc}
     */
    public function addLogger(LoggerInterface $logger, $priority = 0) {
        $this->loggers[$priority][] = $logger;
    }
    
    /**
     * Sorts loggers according to priority.
     *
     * @return array
     *   An array of sorted loggers by priority.
     */
    protected function sortLoggers() {
        krsort($this->loggers);
        return array_merge(...$this->loggers);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
LoggerChannel::$callDepth protected property Number of times LoggerChannel::log() has been called for a single message.
LoggerChannel::$channel protected property The name of the channel of this logger instance.
LoggerChannel::$currentUser protected property The current user object.
LoggerChannel::$levelTranslation protected property Map of PSR3 log constants to RFC 5424 log constants.
LoggerChannel::$loggers protected property An array of arrays of \Psr\Log\LoggerInterface keyed by priority.
LoggerChannel::$requestStack protected property The request stack object.
LoggerChannel::addLogger public function Adds a logger. Overrides LoggerChannelInterface::addLogger
LoggerChannel::log public function 1
LoggerChannel::MAX_CALL_DEPTH constant Maximum call depth to self::log() for a single log message.
LoggerChannel::setCurrentUser public function Sets the current user. Overrides LoggerChannelInterface::setCurrentUser
LoggerChannel::setLoggers public function Sets the loggers for this channel. Overrides LoggerChannelInterface::setLoggers
LoggerChannel::setRequestStack public function Sets the request stack. Overrides LoggerChannelInterface::setRequestStack
LoggerChannel::sortLoggers protected function Sorts loggers according to priority.
LoggerChannel::__construct public function Constructs a LoggerChannel object. 1

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.