You are here

public function GelfLog::log in GELF 8

Overrides RfcLoggerTrait::log

File

src/Logger/GelfLog.php, line 19

Class

GelfLog

Namespace

Drupal\gelf\Logger

Code

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');

  // Remove any backtraces since they may contain an unserializable variable.
  unset($context['backtrace']);

  // Convert PSR3-style messages to SafeMarkup::format() style, so they can be
  // translated too in runtime.
  $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);

  // Now we can create custom messages and publish them.
  $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');
    }
  }
}