<?php
namespace Google\Auth\Logging;
use Psr\Log\LogLevel;
trait LoggingTrait
{
private function logRequest(RpcLogEvent $event): void
{
$debugEvent = [
'timestamp' => $event->timestamp,
'severity' => strtoupper(LogLevel::DEBUG),
'processId' => $event->processId ?? null,
'requestId' => $event->requestId ?? null,
'rpcName' => $event->rpcName ?? null,
];
$debugEvent = array_filter($debugEvent, fn ($value) => !is_null($value));
$jsonPayload = [
'request.method' => $event->method,
'request.url' => $event->url,
'request.headers' => $event->headers,
'request.payload' => $this->truncatePayload($event->payload),
'request.jwt' => $this->getJwtToken($event->headers ?? []),
'retryAttempt' => $event->retryAttempt
];
$debugEvent['jsonPayload'] = array_filter($jsonPayload, fn ($value) => !is_null($value));
$stringifiedEvent = json_encode($debugEvent, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
if ($stringifiedEvent === false) {
return;
}
$this->logger->debug($stringifiedEvent);
}
private function logResponse(RpcLogEvent $event): void
{
$debugEvent = [
'timestamp' => $event->timestamp,
'severity' => strtoupper(LogLevel::DEBUG),
'processId' => $event->processId ?? null,
'requestId' => $event->requestId ?? null,
'jsonPayload' => [
'response.status' => $event->status,
'response.headers' => $event->headers,
'response.payload' => $this->truncatePayload($event->payload),
'latencyMillis' => $event->latency,
]
];
$debugEvent = array_filter($debugEvent, fn ($value) => !is_null($value));
$debugEvent['jsonPayload'] = array_filter(
$debugEvent['jsonPayload'],
fn ($value) => !is_null($value)
);
$stringifiedEvent = json_encode($debugEvent, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
if ($stringifiedEvent !== false) {
$this->logger->debug($stringifiedEvent);
}
}
private function getJwtToken(array $headers): null|array
{
if (empty($headers)) {
return null;
}
$tokenHeader = $headers['Authorization'] ?? '';
$token = str_replace('Bearer ', '', $tokenHeader);
if (substr_count($token, '.') !== 2) {
return null;
}
[$header, $token, $_] = explode('.', $token);
return [
'header' => base64_decode($header),
'token' => base64_decode($token)
];
}
private function truncatePayload(null|string $payload): null|string
{
$maxLength = 500;
if (is_null($payload) || strlen($payload) <= $maxLength) {
return $payload;
}
return substr($payload, 0, $maxLength) . '...';
}
}