solrlog-1.0.1/src/Logger/SolrLogger.php

src/Logger/SolrLogger.php
<?php

namespace Drupal\solrlog\Logger;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LogMessageParserInterface;
use Drupal\Core\Logger\RfcLoggerTrait;
use Drupal\solrlog\DelayedLoggerInterface;
use Drupal\solrlog\SolariumTrait;

/**
 * Logs events in Search API.
 */
class SolrLogger implements DelayedLoggerInterface {
  use RfcLoggerTrait;
  use DependencySerializationTrait;
  use SolariumTrait;

  protected array $delayedMessages = [];

  protected bool $serviceFunctional = TRUE;

  /**
   * Number of runs within single page cycle.
   *
   * Used to distinguish document IDs.
   *
   * @var int
   */
  protected static int $runCount = 0;

  protected bool $delayedLogging = FALSE;

  /**
   * SolrLogger constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
   *   Configuration factory.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   *   The entity type manager.
   * @param \Drupal\Core\Logger\LogMessageParserInterface $parser
   *   The parser to use when extracting message variables.
   */
  public function __construct(
    ConfigFactoryInterface $configFactory,
    protected EntityTypeManagerInterface $entityTypeManager,
    protected LogMessageParserInterface $parser,
  ) {
    $this->delayedLogging = (bool) $configFactory->get('solrlog.settings')
      ->get('delayed_log');
  }

  /**
   * {@inheritdoc}
   */
  public function log($level, string|\Stringable $message, array $context = []): void {
    if (!$this->serviceFunctional) {
      return;
    }
    // Remove backtrace and exception since they may contain
    // an unserializable variable.
    unset($context['exception']);
    // Convert PSR3-style messages to \Drupal\Component\Render\FormattableMarkup
    // style, so they can be translated too in runtime.
    $message_placeholders = $this->parser->parseMessagePlaceholders($message, $context);
    $log = [
      'id' => \time() . (++self::$runCount),
      // This helps to clear/filter the documents.
      'ss_module_id' => 'solrlog',
      'itm_uid' => $context['uid'],
      'ss_type' => mb_substr($context['channel'], 0, 64),
      'tm_message' => $message,
      'tm_variables' => json_encode($message_placeholders, JSON_PRETTY_PRINT),
      'its_severity' => $level,
      'ss_link' => $context['link'],
      'ss_location' => $context['request_uri'],
      'ss_referer' => $context['referer'],
      'ss_hostname' => mb_substr($context['ip'], 0, 128),
      'dt_timestamp' => $context['timestamp'],
    ];
    if ($this->delayedLogging) {
      $this->delayedMessages[] = $log;
      return;
    }
    $this->logMultiple([$log]);
  }

  /**
   * {@inheritDoc}
   */
  public function dump(): void {
    $this->logMultiple($this->delayedMessages);
    $this->delayedMessages = [];
  }

  protected function logMultiple(array $values) {
    if (empty($values)) {
      return;
    }
    $connector = $this->getConnector();
    if (!$connector) {
      return;
    }
    $query = $connector->getUpdateQuery();
    foreach ($values as $value) {
      $query->addDocument($query->createDocument($value));
    }
    $query->addCommit();
    try {
      $connector->update($query);
    }
    catch (\Exception $e) {
      // Prevent infinite loop trying to log the message.
      $this->serviceFunctional = FALSE;
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc