View source
<?php
namespace Drupal\gelf\Logger;
use Drupal\Core\Logger\RfcLoggerTrait;
use Drupal\Core\Logger\LogMessageParserInterface;
use Drupal\Core\Logger\LogMessageParser;
use Psr\Log\LoggerInterface;
use Gelf\Message;
use Gelf\Publisher;
use Gelf\Transport\UdpTransport;
use Drupal\Component\Utility\Unicode;
class GelfLog implements LoggerInterface {
use RfcLoggerTrait;
public function log($level, $message, array $context = array()) {
if (!gelf_require()) {
if (function_exists('user_access') && user_access('administer gelf')) {
drupal_set_message(t('GELF module requires the GELF PHP library to be installed. View the README for installation instructions.'), 'error');
}
return;
}
$settings = \Drupal::config('gelf.settings');
$host = $settings
->get('gelf_host');
$port = $settings
->get('gelf_port');
unset($context['backtrace']);
$parser = new LogMessageParser();
$message_placeholders = $parser
->parseMessagePlaceholders($message, $context);
foreach ($message_placeholders as $key => $value) {
$message = str_replace($key, $value, $message);
}
$transport = new UdpTransport($host, $port, UdpTransport::CHUNK_SIZE_LAN);
$gelf = new Message();
$short_msg_length = 100;
if (strlen($message) > $short_msg_length) {
$short_message = preg_replace('/\\s+?(\\S+)?$/u', '', substr($message, 0, $short_msg_length));
}
else {
$short_message = $message;
}
$username = $context['user']
->getDisplayName();
$gelf
->setShortMessage($short_message);
$gelf
->setFullMessage($message);
$gelf
->setHost(Unicode::substr($context['ip'], 0, 128));
$gelf
->setFacility(Unicode::substr($context['channel'], 0, 64));
$gelf
->setLevel($level);
$gelf
->setTimestamp($context['timestamp']);
$gelf
->setAdditional("Referer", $context['referer']);
$gelf
->setAdditional("Link", $context['link']);
$gelf
->setAdditional("Username", $username);
$gelf
->setAdditional("Uid", $context['uid']);
$gelf
->setAdditional("Request_uri", $context['request_uri']);
$gelf
->setAdditional("Request_method", $_SERVER['REQUEST_METHOD']);
$gelf
->setAdditional("Server_host", $_SERVER['HTTP_HOST']);
$gelf
->setAdditional("Client_host", $context['ip']);
try {
$publisher = new Publisher();
$publisher
->addTransport($transport);
$publisher
->publish($gelf);
} catch (UnexpectedValueException $e) {
if (function_exists('user_access') && user_access('administer gelf')) {
drupal_set_message(t('Failed to publish gelf message: %message', array(
'%message' => $e
->getMessage(),
)), 'error');
}
}
}
}