/** * {@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); }
/** * 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); }
public function testInitWithDefaultValidator() { $pub = new Publisher(); $this->assertInstanceOf('Gelf\\MessageValidatorInterface', $pub->getMessageValidator()); }