prepare( "INSERT INTO api_logs (endpoint, method, ip_address, user_agent, request_body, response_code, error, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, NOW())" ); $stmt->execute([$endpoint, $method, $ip, $userAgent, $body, $responseCode, $error]); } catch (\Throwable $e) { // Logging should never break the app error_log("RequestLogger error: " . $e->getMessage()); } } /** * Mask sensitive fields in request body. */ private static function maskSensitive(string $body): string { $sensitive = ['app_key', 'password', 'otp', 'otp_code']; foreach ($sensitive as $field) { $body = preg_replace( '/"' . $field . '"\s*:\s*"[^"]*"/', '"' . $field . '":"***"', $body ); } return $body; } }