Better HTTP logging.

This commit is contained in:
abdulmohsen
2024-05-16 16:47:02 +03:00
parent 0056910652
commit fc77f33d88
2 changed files with 39 additions and 29 deletions

View File

@@ -60,7 +60,7 @@ final class Webhooks
return api_error('Invalid value for id path parameter.', HTTP_STATUS::HTTP_BAD_REQUEST); return api_error('Invalid value for id path parameter.', HTTP_STATUS::HTTP_BAD_REQUEST);
} }
return $this->process($name, $request)->withHeader('X-Log-Response', '0'); return $this->process($name, $request);
} }
/** /**

View File

@@ -197,39 +197,51 @@ final class Initializer
$response = $response->withAddedHeader('X-Application-Version', getAppVersion()); $response = $response->withAddedHeader('X-Application-Version', getAppVersion());
} }
if (true === (bool)$response->getHeaderLine('X-Log-Response')) { if ('OPTIONS' !== $request->getMethod()) {
if ('OPTIONS' !== $request->getMethod()) { $this->write(
$this->write($request, Level::Info, $this->formatLog($request, $response)); $request,
} $response->getStatusCode() >= 400 ? Level::Error : Level::Info,
$response = $response->withoutHeader('X-Log-Response'); $this->formatLog($request, $response)
);
} }
} catch (Throwable $e) { } catch (HttpException|RouterHttpException $e) {
$httpException = true === ($e instanceof HttpException); $realStatusCode = ($e instanceof RouterHttpException) ? $e->getStatusCode() : $e->getCode();
$routeException = true === ($e instanceof RouterHttpException); $statusCode = $realStatusCode >= 200 && $realStatusCode <= 499 ? $realStatusCode : 503;
$isNormal = true === ($httpException || $routeException);
$statusCode = $isNormal && ($e->getCode() >= 200 && $e->getCode() <= 499) ? $e->getCode() : 503;
$response = addCors( $response = addCors(
api_error( api_error(
message: $isNormal ? "{$e->getCode()}: {$e->getMessage()}" : 'Unable to serve request.', message: "{$realStatusCode}: {$e->getMessage()}",
httpCode: HTTP_STATUS::tryFrom($statusCode) ?? HTTP_STATUS::HTTP_SERVICE_UNAVAILABLE, httpCode: HTTP_STATUS::tryFrom($realStatusCode) ?? HTTP_STATUS::HTTP_SERVICE_UNAVAILABLE,
) )
); );
if (!$isNormal || HTTP_STATUS::HTTP_SERVICE_UNAVAILABLE->value === $statusCode) { if (HTTP_STATUS::HTTP_SERVICE_UNAVAILABLE->value === $statusCode) {
Container::get(LoggerInterface::class)->error( Container::get(LoggerInterface::class)->error($e->getMessage(), [
message: $e->getMessage(), 'kind' => $e::class,
context: [ 'file' => $e->getFile(),
'kind' => $e::class, 'line' => $e->getLine(),
'file' => $e->getFile(), 'trace' => $e->getTrace(),
'line' => $e->getLine(), ]);
'trace' => $e->getTrace(),
]
);
} }
$this->write($request, Level::Info, $this->formatLog($request, $response)); $this->write(
$request,
$statusCode >= 400 ? Level::Error : Level::Info,
$this->formatLog($request, $response)
);
} catch (Throwable $e) {
$response = addCors(
api_error(message: 'Unable to serve request.', httpCode: HTTP_STATUS::HTTP_SERVICE_UNAVAILABLE)
);
Container::get(LoggerInterface::class)->error($e->getMessage(), [
'kind' => $e::class,
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTrace(),
]);
$this->write($request, Level::Error, $this->formatLog($request, $response));
} }
$emitter($response); $emitter($response);
@@ -375,9 +387,6 @@ final class Initializer
})(); })();
$response = $router->dispatch($realRequest); $response = $router->dispatch($realRequest);
if (!$response->hasHeader('X-Log-Response')) {
$response = $response->withHeader('X-Log-Response', '1');
}
return $response->withHeader('Access-Control-Allow-Origin', '*') return $response->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Credentials', 'true'); ->withHeader('Access-Control-Allow-Credentials', 'true');
@@ -560,6 +569,7 @@ final class Initializer
$context = array_replace_recursive([ $context = array_replace_recursive([
'request' => [ 'request' => [
'method' => $request->getMethod(), 'method' => $request->getMethod(),
'path' => $uri->getPath(),
'id' => ag($params, 'X_REQUEST_ID'), 'id' => ag($params, 'X_REQUEST_ID'),
'ip' => getClientIp($request), 'ip' => getClientIp($request),
'agent' => ag($params, 'HTTP_USER_AGENT'), 'agent' => ag($params, 'HTTP_USER_AGENT'),
@@ -594,7 +604,7 @@ final class Initializer
'uri' => $request->getUri()->getPath(), 'uri' => $request->getUri()->getPath(),
'protocol' => 'HTTP/' . $request->getProtocolVersion(), 'protocol' => 'HTTP/' . $request->getProtocolVersion(),
'status' => $response->getStatusCode(), 'status' => $response->getStatusCode(),
'size' => $response->getBody()->getSize(), 'size' => $response->getBody()->getSize() ?? 0,
'agent' => ag($request->getServerParams(), 'HTTP_USER_AGENT', '-'), 'agent' => ag($request->getServerParams(), 'HTTP_USER_AGENT', '-'),
'refer' => (string)$refer, 'refer' => (string)$refer,
'message' => $message ?? '-', 'message' => $message ?? '-',