public static function log(
        LoggerInterface $logger,
        GuzzleLogMessageFormatter $messageFormatter
    ) {
        return function (callable $handler) use ($logger, $messageFormatter) {
            return function ($request, array $options) use ($handler, $logger, $messageFormatter) {
                return $handler($request, $options)->then(

                    function ($response) use ($request, $logger, $messageFormatter) {
                        // Logs messages in case of successful HTTP calls.
                        $logger->info(
                            $messageFormatter->formatSummary($request, $response)
                        );

                        // formatDetailed() can produce long log messages
                        // so check if it handles DEBUG level when possible.
                        if (!($logger instanceof Logger)
                            || $logger->isHandling(Logger::DEBUG)) {
                            $logger->debug($messageFormatter->formatDetailed(
                                $request,
                                $response
                            ));
                        }

                        return $response;
                    },
                    function ($reason) use ($request, $logger, $messageFormatter) {
                        // Logs messages in case of failing HTTP calls.
                        $response = is_subclass_of(
                            $reason,
                            'GuzzleHttp\Exception\RequestException'
                        ) ? $reason->getResponse() : null;

                        $logger->warning(
                            $messageFormatter->formatSummary($request, $response)
                        );

                        // formatDetailed() can produce long log messages
                        // so check if it handles NOTICE level when
                        // possible.
                        if (!($logger instanceof Logger)
                            || $logger->isHandling(Logger::NOTICE)) {
                            $logger->notice($messageFormatter->formatDetailed(
                                $request,
                                $response,
                                $reason
                            ));
                        }

                        return \GuzzleHttp\Promise\rejection_for($reason);
                    }
                );
            };
        };
    }