最近写一个代码的时候,需要使用requests从外部系统拿一些数据.外部系统有一些权限认证,又没有SDK,只有自己根据文档写了一个.其中比较麻烦的是发出去的请求没有办法看到request,response所有细节,错了都不知道怎么回事.
实在没有办法,用了tcpdump直接抓包来看,但是调试一下就抓一下包,然后分析一下,确实太麻烦了.然后搜索了一下requests的日志打印,总结如下.
python的日志层次结构python的logging模块中有很多的logger,这些logger组成了一颗树.每个logger都有一个有效level,这个有效level决定了日志是输出还是忽略.
这颗树最顶层是root logger,其默认的level是WARNING(30).其他的logger的默认level是NOSET(0),NOSET表示自己的level没有设置,由最近的设置了level的祖先logger来决定.
官方文档描述的logger有效level问题
比如在完全没有对logging系统进行配置的情况下.root logger的level是30(WARNING),而且其他logger的有效level也是30(WARNNING)
因为其他的logger的level为默认值0(NOSET),有效level又最近的设置了level的logger(root)决定.
在把root logger的level设置为DEBUG(10)之后,其他logger的有效level也变成了10(DEBUG)
requests的日志输出配置了logging level,让requests的有效level是DEBUG之后,使用如下代码来测试requests的日志输出
我们能看到发出的请求和返回的基本信息了
但是里面没有输出request和response的HTTP HEADER信息,定位问题还是比较麻烦.
需要通过打开http.client的debuglevel来解决
这样请求和返回的http header都输出了.
总结
python的库基本都有一个logging logger,如果要单独配置,那么需要通过观察logging.root.manager.loggerDict里面的名字来配置.我一般都是直接配置root logger,这样其他的库里面的logger有效level也就跟着变了.