Get a SOAP Client object for the given WSDL. Client objects are cached in :attr:`soap.clients <soap.clients>`
    and keyed by the WSDL URL.

    :param wsdl: String URL of a SOAP WSDL
    :param log_prefix: String prefix to prepend to log lines (when logging XML traffic in DEBUG mode)
    :param plugins: List of additional plugins :class:`suds.plugin.Plugin <suds.plugin.Plugin>` to pass on to the
        :class:`suds.client.Client <suds.client.Client>` object.
    :param kwargs: Optional keyword arguments to pass on to the :class:`suds.client.Client <suds.client.Client>` object
    :return: :class:`suds.client.Client <suds.client.Client>` object
    :rtype: suds.client.Client

def get_client(wsdl, log_prefix, plugins=[], **kwargs):
    """
    Get a SOAP Client object for the given WSDL. Client objects are cached in :attr:`soap.clients <soap.clients>`
    and keyed by the WSDL URL.

    :param wsdl: String URL of a SOAP WSDL
    :param log_prefix: String prefix to prepend to log lines (when logging XML traffic in DEBUG mode)
    :param plugins: List of additional plugins :class:`suds.plugin.Plugin <suds.plugin.Plugin>` to pass on to the
        :class:`suds.client.Client <suds.client.Client>` object.
    :param kwargs: Optional keyword arguments to pass on to the :class:`suds.client.Client <suds.client.Client>` object
    :return: :class:`suds.client.Client <suds.client.Client>` object
    :rtype: suds.client.Client
    """
    if wsdl in settings.WSDL_INTERCEPTS:
        wsdl = settings.WSDL_INTERCEPTS[wsdl]

    if wsdl not in clients:
        if settings.DEBUG:
            plugins.append( LogPlugin(log_prefix) )

        try:
            clients[wsdl] = Client(wsdl, plugins=plugins, transport=get_transport(), **kwargs)
        except Exception as e:
            statsd.incr('soap.wsdl-creation-error')
            logger.fatal('Failed to create SOAP client with WSDL at %s' % wsdl)
            raise e
    return clients[wsdl]