Beispiel #1
0
 /**
  * {@inheritdoc}
  */
 public function report($priority, $message, $extra = [])
 {
     $grayLogMessage = new Message();
     $grayLogMessage->setShortMessage($message);
     $grayLogMessage->setFullMessage($extra ? print_r($extra, true) : $message);
     $grayLogMessage->setHost((Console::isConsole() ? 'Console' : $_SERVER['HTTP_HOST']));
     $grayLogMessage->setLevel($priority);
     $grayLogMessage->setTimestamp(time());
     $grayLogMessage->setVersion('1.0');
     $this->publisher->publish($grayLogMessage);
 }
Beispiel #2
0
 /**
  * Processes log messages and sends them to specific destination.
  * Derived child classes must implement this method.
  * @param array $logs list of messages. Each array element represents one message
  * with the following structure:
  * array(
  *   [0] => message (string)
  *   [1] => level (string)
  *   [2] => category (string)
  *   [3] => timestamp (float, obtained by microtime(true));
  */
 protected function processLogs($logs)
 {
     $publisher = new Gelf\Publisher($this->transport);
     foreach ($logs as $logItem) {
         list($message, $level, $category, $timestamp) = $logItem;
         $gelfMessage = new Gelf\Message();
         if (is_string($message)) {
             $gelfMessage->setShortMessage($message);
         } elseif (!is_array($message)) {
             $gelfMessage->setShortMessage(var_export($message, true));
         } else {
             if (isset($message['message'])) {
                 $gelfMessage->setShortMessage($message['message']);
                 unset($message['message']);
                 foreach ($message as $key => $val) {
                     if (is_string($key)) {
                         $gelfMessage->setAdditional($key, is_string($val) ? $val : var_export($val, true));
                     }
                 }
             } else {
                 $gelfMessage->setShortMessage(var_export($message, true));
             }
         }
         $gelfMessage->setLevel(($_ =& $this->_levels[$level]) ?: LogLevel::INFO)->setTimestamp($timestamp)->setFacility($category)->setAdditional('level_name', strtolower($level));
         foreach ($this->extra as $key => $val) {
             if (is_string($key)) {
                 $gelfMessage->setAdditional($key, is_string($val) ? $val : var_export($val, true));
             }
         }
         if (isset($logItem[4]) && is_array($logItem[4])) {
             $traces = [];
             foreach ($logItem[4] as $index => $trace) {
                 $traces[] = "{$trace['file']}:{$trace['line']}";
                 if (0 === $index) {
                     $gelfMessage->setFile($trace['file']);
                     $gelfMessage->setLine($trace['line']);
                 }
             }
             $gelfMessage->setAdditional('trace', implode("\n", $traces));
         }
         // Publishing message
         $publisher->publish($gelfMessage);
     }
 }
 /**
  * @param \Exception $exception
  * @return void
  */
 public function logException(\Exception $exception)
 {
     if (!isset($this->settings['host']) || strlen($this->settings['host']) === 0) {
         return;
     }
     $statusCode = NULL;
     if ($exception instanceof FlowException) {
         $statusCode = $exception->getStatusCode();
     }
     // skip exceptions with status codes matching "skipStatusCodes" setting
     if (isset($this->settings['skipStatusCodes']) && in_array($statusCode, $this->settings['skipStatusCodes'])) {
         return;
     }
     $host = $this->settings['host'];
     $port = isset($this->settings['port']) ? $this->settings['port'] : UdpTransport::DEFAULT_PORT;
     // set chunk size option to wan (default) or lan
     if (isset($this->settings['chunksize']) && strtolower($this->settings['chunksize']) === 'lan') {
         $chunkSize = UdpTransport::CHUNK_SIZE_LAN;
     } else {
         $chunkSize = UdpTransport::CHUNK_SIZE_WAN;
     }
     // setup connection to graylog server
     $transport = new UdpTransport($host, $port, $chunkSize);
     $publisher = new Publisher();
     $publisher->addTransport($transport);
     // set logLevel depending on http status code
     $logLevel = 4;
     // warning
     if ($statusCode === 500) {
         $logLevel = 3;
         // error
     }
     // build message context
     $messageContext = array('full_message' => $exception->getTraceAsString(), 'reference_code' => $exception instanceof FlowException ? $exception->getReferenceCode() : NULL, 'response_status' => $statusCode, 'short_message' => sprintf('%d %s', $statusCode, Response::getStatusMessageByCode($statusCode)), 'code' => $exception->getCode(), 'file' => $exception->getFile(), 'line' => $exception->getLine());
     if ($this->securityContext !== NULL && $this->securityContext->isInitialized()) {
         $account = $this->securityContext->getAccount();
         if ($account !== NULL) {
             $messageContext['authenticated_account'] = $account->getAccountIdentifier() . ' (' . $this->persistenceManager->getIdentifierByObject($account) . ')';
             $messageContext['authenticated_roles'] = implode(', ', array_keys($this->securityContext->getRoles()));
             if ($this->objectManager->isRegistered(PartyService::class)) {
                 /** @var PartyService $partyService */
                 $partyService = $this->objectManager->get(PartyService::class);
                 $person = $partyService->getAssignedPartyOfAccount($account);
                 if ($person instanceof Person) {
                     $messageContext['authenticated_person'] = (string) $person->getName() . ' (' . $this->persistenceManager->getIdentifierByObject($person) . ')';
                 }
             }
         }
     }
     // prepare request details
     if (Bootstrap::$staticObjectManager instanceof ObjectManagerInterface) {
         $bootstrap = Bootstrap::$staticObjectManager->get('TYPO3\\Flow\\Core\\Bootstrap');
         /* @var Bootstrap $bootstrap */
         $requestHandler = $bootstrap->getActiveRequestHandler();
         if ($requestHandler instanceof HttpRequestHandlerInterface) {
             $request = $requestHandler->getHttpRequest();
             $requestData = array('request_domain' => $request->getHeader('Host'), 'request_remote_addr' => $request->getClientIpAddress(), 'request_path' => $request->getRelativePath(), 'request_uri' => $request->getUri()->getPath(), 'request_user_agent' => $request->getHeader('User-Agent'), 'request_method' => $request->getMethod(), 'request_port' => $request->getPort());
             $messageContext = array_merge($messageContext, $requestData);
         }
     }
     // send message to graylog server
     $logger = new Logger($publisher);
     $logger->log($logLevel, $exception->getMessage(), $messageContext);
 }
Beispiel #4
0
 public function testInitWithDefaultValidator()
 {
     $pub = new Publisher();
     $this->assertInstanceOf('Gelf\\MessageValidatorInterface', $pub->getMessageValidator());
 }