/** * {@inheritdoc} */ public function format(array $record) { $record = parent::format($record); $message = new \Gelf\Message(); $message->setTimestamp($record['datetime'])->setShortMessage((string) $record['message'])->setFacility($record['channel'])->setHost($this->systemName)->setLine(isset($record['extra']['line']) ? $record['extra']['line'] : null)->setFile(isset($record['extra']['file']) ? $record['extra']['file'] : null)->setLevel($this->logLevels[$record['level']]); // Do not duplicate these values in the additional fields unset($record['extra']['line']); unset($record['extra']['file']); foreach ($record['extra'] as $key => $val) { $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); } foreach ($record['context'] as $key => $val) { $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); } if (null === $message->getFile() && isset($record['context']['exception'])) { if (preg_match("/^(.+):([0-9]+)\$/", $record['context']['exception']['file'], $matches)) { $message->setFile($matches[1]); $message->setLine($matches[2]); } } return $message; }
protected function log($data) { foreach ($this->urls as $url) { $url = trim($url); $url = parse_url($url); switch ($url['scheme']) { case 'json-path': $path = __DIR__ . '/../../' . $url['host'] . $url['path']; $path = str_replace('{date}', date('Ymd'), $path); $json = json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_UNESCAPED_SLASHES); //$path = $this->getRootPath() . '/app/logs/requests/' . date('Ymd') . '/'; if (!file_exists($path)) { mkdir($path, 0777, true); } $filename = $path . '/' . date('Ymd-His') . '-' . $data['request-id'] . '.json'; file_put_contents($filename, $json . "\n"); break; case 'gelf-udp': $transport = new \Gelf\Transport\UdpTransport($url['host'], $url['port'], \Gelf\Transport\UdpTransport::CHUNK_SIZE_WAN); $gelfData = $data; $publisher = new \Gelf\Publisher(); $publisher->addTransport($transport); $message = new \Gelf\Message(); $message->setShortMessage("Request")->setLevel(\Psr\Log\LogLevel::DEBUG)->setFullMessage("")->setFacility("")->setHost($data['host']); $gelfData['host'] = null; $gelfData['datetime'] = null; array_filter($gelfData); foreach ($gelfData as $key => $value) { $message->setAdditional($key, $value); } $res = $publisher->publish($message); break; default: throw new RuntimeException('Unsupported request_log url scheme: ' . $url['scheme']); } } }
public function configureRequestLogger() { if (!isset($this['parameters']['request_log'])) { return; } $this->after(function (Request $request, Response $response) { $data = ['datetime' => date('Y-m-d H:i:s'), 'method' => $request->getMethod(), 'scheme' => $request->getScheme(), 'host' => $request->getHttpHost(), 'uri' => $request->getRequestUri(), 'route' => $request->get('_route')]; if (isset($this['current_user'])) { $data['username'] = $this['current_user']->getName(); } $data['address'] = $request->getClientIp(); $data['session-id'] = $request->getSession()->getId(); $data['agent'] = $request->getSession()->getId(); if ($request->headers->has('User-Agent')) { $data['agent'] = $request->headers->get('User-Agent'); } if ($request->headers->has('referer')) { $data['referer'] = $request->headers->get('referer'); } // response details $data['status'] = $response->getStatusCode(); if ($response->headers->has('Content-Type')) { $data['content-type'] = $response->headers->get('content-type'); } $urls = $this['parameters']['request_log']; foreach (explode(',', $urls) as $url) { $url = trim($url); $url = parse_url($url); //print_r($url); switch ($url['scheme']) { case 'json-path': $path = '/' . $url['scheme'] . $url['path']; $json = json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_UNESCAPED_SLASHES); $path = $this->getRootPath() . '/app/logs/requests/' . date('Ymd') . '/'; if (!file_exists($path)) { mkdir($path, 0777, true); } $filename = $path . '/' . date('Ymd-His') . '-' . sha1(rand()) . '.json'; file_put_contents($filename, $json . "\n"); break; case 'gelf-udp': $transport = new \Gelf\Transport\UdpTransport($url['host'], $url['port'], \Gelf\Transport\UdpTransport::CHUNK_SIZE_WAN); $gelfData = $data; $publisher = new \Gelf\Publisher(); $publisher->addTransport($transport); $message = new \Gelf\Message(); $message->setShortMessage("Request")->setLevel(\Psr\Log\LogLevel::DEBUG)->setFullMessage("")->setFacility("")->setHost($data['host']); $gelfData['host'] = null; $gelfData['datetime'] = null; array_filter($gelfData); foreach ($gelfData as $key => $value) { $message->setAdditional($key, $value); } $res = $publisher->publish($message); break; default: throw new RuntimeException('Unsupported request_log url scheme: ' . $url['scheme']); } } }); }
public function log($err) { $config = Registry::get('config'); // We need a transport - UDP via port 12201 is standard. $transport = new \Gelf\Transport\UdpTransport($config->error->logger->gelf->ip, $config->error->logger->gelf->port, \Gelf\Transport\UdpTransport::CHUNK_SIZE_LAN); // While the UDP transport is itself a publisher, we wrap it in a real Publisher for convenience // A publisher allows for message validation before transmission, and it calso supports to send messages // to multiple backends at once $publisher = new \Gelf\Publisher(); $publisher->addTransport($transport); $fullMessage = \Nf\Front\Response\Cli::displayErrorHelper($err); // Now we can create custom messages and publish them $message = new \Gelf\Message(); $message->setShortMessage(Handler::recursiveArrayToString($err['message']))->setLevel(\Psr\Log\LogLevel::ERROR)->setFile($err['file'])->setLine($err['line'])->setFullMessage($fullMessage); if (php_sapi_name() == 'cli') { global $argv; $message->setAdditional('url', 'su ' . $_SERVER['LOGNAME'] . ' -c "php ' . Registry::get('applicationPath') . '/html/' . implode(' ', $argv) . '"'); } else { $message->setAdditional('url', 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); } if (isset($config->error->logger->additionals)) { foreach ($config->error->logger->additionals as $additionalName => $additionalValue) { $message->setAdditional($additionalName, $additionalValue); } } if ($publisher->publish($message)) { return true; } else { return false; } }