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;
}
}
}
