/** * @dataProvider dateProvider */ public function testFormatsTimestamps($format, $pattern) { $f = new MessageFormatter($format); $request = new Request('GET', '/'); $result = $f->format($request); $this->assertEquals(1, preg_match($pattern, $result)); }
/** * @dataProvider errorRequestsProvider */ public function testGetErrorRequests(array $logs, $expected) { $this->logAdapter->expects($this->once())->method('getLogs')->willReturn($logs); $this->requestFormatter->expects($this->atMost(count($logs)))->method('format'); $this->responseFormatter->expects($this->atMost(count($logs)))->method('format'); $response = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\Response')->getMock(); $request = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\Request')->getMock(); $this->dataCollector->collect($request, $response); $this->assertCount($expected, $this->dataCollector->getErrorRequests()); }
/** * Formats a request and response as a log message. * * @param RequestInterface $request * @param ResponseInterface|null $response * @param mixed $reason * * @return string The formatted message. */ protected function getLogMessage(RequestInterface $request, ResponseInterface $response = null, $reason = null) { if ($this->formatter instanceof MessageFormatter) { return $this->formatter->format($request, $response, $reason); } return call_user_func($this->formatter, $request, $response, $reason); }
private static function create500Decider(LoggerInterface $logger, $maxRetries) { return function ($retries, RequestInterface $request, ResponseInterface $response = null, $error = null) use($maxRetries, $logger) { if ($retries >= $maxRetries) { return false; } elseif ($response && in_array($response->getStatusCode(), array(500))) { if (!$request->hasHeader('X-Orchestrator-Poll')) { return false; } $formatter = new MessageFormatter('[{ts}] {method} {url} - {code} {phrase}'); $delay = MiddlewareBuilder::createDefaultDelay(); $logger->log(LogLevel::INFO, sprintf('%s - Retries: %s, Delay: %s s', $formatter->format($request, $response, $error), $retries + 1, $delay($retries) / 1000)); return true; } elseif ($error) { return false; } else { return false; } }; }
/** * {@inheritdoc} */ public function collect(Request $request, Response $response, \Exception $exception = null) { foreach ($this->logAdapter->getLogs() as $log) { $requestId = spl_object_hash($log['extras']['request']); if (isset($this->data['requests'][$requestId])) { continue; } /** @var RequestInterface $guzzleRequest */ $guzzleRequest = $log['extras']['request']; /** @var ResponseInterface $guzzleResponse */ $guzzleResponse = $log['extras']['response']; $datum['message'] = $log['message']; $datum['time'] = $log['extras']['time']; $datum['request'] = $this->requestFormatter->format($guzzleRequest); $datum['response'] = $this->responseFormatter->format($guzzleRequest, $guzzleResponse); $datum['is_error'] = $this->isError($guzzleResponse); $datum['status_code'] = $guzzleResponse->getStatusCode(); $datum['method'] = $guzzleRequest->getMethod(); $this->data['requests'][$requestId] = $datum; } }
/** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received * @param \Exception $error Exception that was received * * @return string */ public function format(RequestInterface $request, ResponseInterface $response = null, \Exception $error = null) { $message = parent::format($request, $response, $error); $patterns = []; $replacements = []; $patterns[] = '/(<password[^>]*>)(.*?)(<\\/password>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<accountnumber[^>]*>)(.*?)(<\\/accountnumber>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<cardnum[^>]*>)(.*?)(<\\/cardnum>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<ssn[^>]*>)(.*?)(<\\/ssn>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<achaccountnumber[^>]*>)(.*?)(<\\/achaccountnumber>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<wireaccountnumber[^>]*>)(.*?)(<\\/wireaccountnumber>)/i'; $replacements[] = '$1REDACTED$3'; $patterns[] = '/(<taxid[^>]*>)(.*?)(<\\/taxid>)/i'; $replacements[] = '$1REDACTED$3'; return preg_replace($patterns, $replacements, $message); }
/** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO) { return function (callable $handler) use($logger, $formatter, $logLevel) { return function ($request, array $options) use($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter, $logLevel) { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, function ($reason) use($logger, $request, $formatter) { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, $reason); $logger->notice($message); return \GuzzleHttp\Promise\rejection_for($reason); }); }; }; }
/** * Formats a request and response as a log message. * * @param Request $request * @param array $bundle * @param string $event * * @return string The formatted message. */ protected function getLogMessage(Request $request, array $bundle, $event) { $template = $this->prepareTemplate(['event' => $event, 'expires' => $bundle['expires'] - time()]); $response = $bundle['response']; $formatter = new MessageFormatter($template); return $formatter->format($request, $response); }