49

我有以下代码:

from suds.client import Client
import logging

logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)

SB_PRIVATE_ACCESS = {"PATH":"https://thisurl.com:443/services/",}

client = Client(SB_PRIVATE_ACCESS['PATH'])
print client

但我收到 500 个错误。我正在尝试将通过 SUD 生成和接收的 XML 发送给 wsdl 开发人员,但我不知道如何输出它?我一直在查看 SUD 的文档,但似乎找不到它:/ 有谁知道如何输出发送和接收的原始 xml?

4

7 回答 7

76

SUDS 提供了一些方便的方法来做到这一点:

 client.last_sent()
 client.last_received()

这些应该为您提供所需的东西。我用它们来记录错误。 Client 类的 API 文档应该包含您需要的任何额外信息。

于 2011-05-20T07:59:04.220 回答
20

您可以使用 MessagePlugin 来执行此操作(这将适用于已删除 last_sent 和 last_received 的较新的 Jurko fork)

from suds.plugin import MessagePlugin

class LogPlugin(MessagePlugin):
  def sending(self, context):
    print(str(context.envelope))
  def received(self, context):
    print(str(context.reply))

client = Client("http://localhost/wsdl.wsdl", plugins=[LogPlugin()])
于 2014-06-05T15:53:14.943 回答
15

正如您一直在做的那样,Suds 支持内部日志记录。

我正在像你一样设置信息级别:

logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG) # MUST BE THIS?
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)
logging.getLogger('suds.resolver').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.query').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.basic').setLevel(logging.DEBUG)
logging.getLogger('suds.binding.marshaller').setLevel(logging.DEBUG)

而且我有时还需要覆盖根记录器日志记录级别,具体取决于在 Suds 调用(Django、Plone)下使用的框架。如果根记录器具有更高的记录阈值,则日志消息可能永远不会出现(不确定记录器层次结构应该如何)。下面是一个如何覆盖的示例:

def enableDebugLog(self):
    """ Enable context.plone_log() output from Python scripts """
    import sys, logging
    logger = logging.getLogger()        
    logger.root.setLevel(logging.DEBUG)
    logger.root.addHandler(logging.StreamHandler(sys.stdout))
于 2011-05-17T17:39:21.500 回答
8

要仅获取生成的消息,这也可以:

from suds.client import Client
import sys

SB_PRIVATE_ACCESS = {"PATH":"https://thisurl.com:443/services/",}

client = Client(SB_PRIVATE_ACCESS['PATH'])

client.set_options(nosend=True)

resp = ...<invoke client here>...

sys.stdout.buffer.write(resp.envelope)
于 2014-01-12T18:41:12.160 回答
3

尝试改变

logging.basicConfig(level=logging.INFO)

logging.basicConfig(filename="/tmp/suds.log", level=logging.DEBUG)
于 2011-06-08T15:15:59.983 回答
1

如果您想减少 jurko-suds 的日志记录

 logging.basicConfig(level=logging.INFO)

    logging.getLogger('suds.client').setLevel(logging.INFO)
    logging.getLogger('suds.transport').setLevel(logging.INFO) 
    logging.getLogger('suds.xsd.schema').setLevel(logging.INFO)
    logging.getLogger('suds.wsdl').setLevel(logging.INFO)
    logging.getLogger('suds.resolver').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.query').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbasic').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbase').setLevel(logging.INFO)
    logging.getLogger('suds.metrics').setLevel(logging.INFO)
    logging.getLogger('suds.binding.marshaller').setLevel(logging.INFO)
于 2016-01-08T06:29:55.157 回答
1

我在使用 bingads API 时遇到了这个问题,值得注意的是顺序很重要,我必须导入日志记录,然后导入 suds 启动日志记录,然后导入 bingads,任何其他顺序,并且从 suds 的日志中没有输出任何内容。

因此,请检查您的导入顺序,并移动您的日志记录语句,它可能会解决您的问题。

于 2018-05-21T15:50:58.037 回答