View source
<?php
namespace Drupal\tmgmt_smartling\Logger;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Logger\LogMessageParserInterface;
use Drupal\Core\Logger\RfcLogLevel;
use Drupal\tmgmt_smartling\Smartling\SmartlingApiFactory;
use Exception;
use GuzzleHttp\Client;
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerTrait;
use Psr\Log\LogLevel;
use Smartling\AuthApi\AuthTokenProvider;
use Smartling\BaseApiAbstract;
use Symfony\Component\HttpFoundation\RequestStack;
class BufferLogger implements LoggerInterface {
use LoggerTrait;
protected $level_translation = [
RfcLogLevel::EMERGENCY => LogLevel::EMERGENCY,
RfcLogLevel::ALERT => LogLevel::ALERT,
RfcLogLevel::CRITICAL => LogLevel::CRITICAL,
RfcLogLevel::ERROR => LogLevel::ERROR,
RfcLogLevel::WARNING => LogLevel::WARNING,
RfcLogLevel::NOTICE => LogLevel::NOTICE,
RfcLogLevel::INFO => LogLevel::INFO,
RfcLogLevel::DEBUG => LogLevel::DEBUG,
];
private $buffer;
private $buffer_limit;
private $channels;
private $time_out;
private $parser;
private $config_factory;
private $provider_settings = [];
private $request_stack;
private $log_level;
private $host;
private $http_client;
public function __construct(Client $http_client, LogMessageParserInterface $parser, ConfigFactoryInterface $config_factory, RequestStack $request_stack, $channels = [
'tmgmt_smartling',
'tmgmt_smartling_context_debug',
'tmgmt_extension_suit',
'smartling_api',
], $log_level = RfcLogLevel::DEBUG, $host = 'https://api.smartling.com/updates/status', $buffer_limit = 100, $time_out = 5) {
$this->buffer = [];
$this->http_client = $http_client;
$this->channels = $channels;
$this->parser = $parser;
$this->config_factory = $config_factory;
$this->request_stack = $request_stack;
$this->log_level = $log_level;
$this->host = $host;
$this->buffer_limit = $buffer_limit;
$this->time_out = $time_out;
$translator_ids = $this->config_factory
->listAll('tmgmt.translator');
foreach ($translator_ids as $id) {
$config = $this->config_factory
->get($id);
if ($config
->get('plugin') === 'smartling') {
$this->provider_settings = $config
->getRawData();
break;
}
}
drupal_register_shutdown_function([
$this,
'flush',
]);
}
public function log($level, $message, array $context = []) {
if (empty($this->channels) || in_array($context['channel'], $this->channels)) {
$enabled_logging = !isset($this->provider_settings['settings']['enable_smartling_logging']) || $this->provider_settings['settings']['enable_smartling_logging'] === TRUE;
if ($level <= $this->log_level && !empty($this->provider_settings['settings']['project_id']) && $enabled_logging) {
$this->buffer[] = [
'level' => $level,
'message' => $message,
'context' => $context,
];
if (count($this->buffer) == $this->buffer_limit) {
$this
->flush();
}
}
}
}
public function flush() {
if (empty($this->buffer)) {
return;
}
try {
$records = [];
$project_id = $this->provider_settings['settings']['project_id'];
$host = php_uname('n');
$http_host = $this->request_stack
->getCurrentRequest()
->getHost();
foreach ($this->buffer as $drupal_log_record) {
$message_placeholders = $this->parser
->parseMessagePlaceholders($drupal_log_record['message'], $drupal_log_record['context']);
$records[] = [
'level_name' => $this->level_translation[$drupal_log_record['level']],
'channel' => 'drupal-tmgmt-connector_' . $host . '_' . $project_id,
'datetime' => date('Y-m-d H:i:s', $drupal_log_record['context']['timestamp']),
'context' => [
'projectId' => $project_id,
'host' => $host,
'http_host' => $http_host,
'moduleVersion' => SmartlingApiFactory::getModuleVersion(),
'remoteChannel' => $drupal_log_record['context']['channel'],
],
'message' => strtr($drupal_log_record['message'], $message_placeholders),
];
}
$this->http_client
->request('POST', $this->host, [
'json' => [
'records' => $records,
],
'timeout' => $this->time_out,
'headers' => [
'User-Agent' => 'drupal-tmgmt-connector/' . SmartlingApiFactory::getModuleVersion(),
],
]);
} catch (Exception $e) {
}
$this->buffer = [];
}
}