Chris@0: RfcLogLevel::EMERGENCY, Chris@0: LogLevel::ALERT => RfcLogLevel::ALERT, Chris@0: LogLevel::CRITICAL => RfcLogLevel::CRITICAL, Chris@0: LogLevel::ERROR => RfcLogLevel::ERROR, Chris@0: LogLevel::WARNING => RfcLogLevel::WARNING, Chris@0: LogLevel::NOTICE => RfcLogLevel::NOTICE, Chris@0: LogLevel::INFO => RfcLogLevel::INFO, Chris@0: LogLevel::DEBUG => RfcLogLevel::DEBUG, Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * An array of arrays of \Psr\Log\LoggerInterface keyed by priority. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: protected $loggers = []; Chris@0: Chris@0: /** Chris@0: * The request stack object. Chris@0: * Chris@0: * @var \Symfony\Component\HttpFoundation\RequestStack Chris@0: */ Chris@0: protected $requestStack; Chris@0: Chris@0: /** Chris@0: * The current user object. Chris@0: * Chris@0: * @var \Drupal\Core\Session\AccountInterface Chris@0: */ Chris@0: protected $currentUser; Chris@0: Chris@0: /** Chris@0: * Constructs a LoggerChannel object Chris@0: * Chris@0: * @param string $channel Chris@0: * The channel name for this instance. Chris@0: */ Chris@0: public function __construct($channel) { Chris@0: $this->channel = $channel; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function log($level, $message, array $context = []) { Chris@0: if ($this->callDepth == self::MAX_CALL_DEPTH) { Chris@0: return; Chris@0: } Chris@0: $this->callDepth++; Chris@0: Chris@0: // Merge in defaults. Chris@0: $context += [ Chris@0: 'channel' => $this->channel, Chris@0: 'link' => '', Chris@0: 'uid' => 0, Chris@0: 'request_uri' => '', Chris@0: 'referer' => '', Chris@0: 'ip' => '', Chris@0: 'timestamp' => time(), Chris@0: ]; Chris@0: // Some context values are only available when in a request context. Chris@0: if ($this->requestStack && $request = $this->requestStack->getCurrentRequest()) { Chris@0: $context['request_uri'] = $request->getUri(); Chris@0: $context['referer'] = $request->headers->get('Referer', ''); Chris@0: $context['ip'] = $request->getClientIP(); Chris@18: Chris@18: if ($this->currentUser) { Chris@18: $context['uid'] = $this->currentUser->id(); Chris@0: } Chris@0: } Chris@0: Chris@0: if (is_string($level)) { Chris@0: // Convert to integer equivalent for consistency with RFC 5424. Chris@0: $level = $this->levelTranslation[$level]; Chris@0: } Chris@0: // Call all available loggers. Chris@0: foreach ($this->sortLoggers() as $logger) { Chris@0: $logger->log($level, $message, $context); Chris@0: } Chris@0: Chris@0: $this->callDepth--; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRequestStack(RequestStack $requestStack = NULL) { Chris@0: $this->requestStack = $requestStack; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setCurrentUser(AccountInterface $current_user = NULL) { Chris@0: $this->currentUser = $current_user; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setLoggers(array $loggers) { Chris@0: $this->loggers = $loggers; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function addLogger(LoggerInterface $logger, $priority = 0) { Chris@0: $this->loggers[$priority][] = $logger; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sorts loggers according to priority. Chris@0: * Chris@0: * @return array Chris@0: * An array of sorted loggers by priority. Chris@0: */ Chris@0: protected function sortLoggers() { Chris@0: $sorted = []; Chris@0: krsort($this->loggers); Chris@0: Chris@0: foreach ($this->loggers as $loggers) { Chris@0: $sorted = array_merge($sorted, $loggers); Chris@0: } Chris@0: return $sorted; Chris@0: } Chris@0: Chris@0: }