使用日志记录打印pprint的输出


99

我想使用pprint的输出来显示复杂的数据结构,但是我想使用日志记录模块而不是stdout来输出它。

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

我浏览了一下文档并找到了pprint( {}, stream ),但是发现它很尴尬。我本以为类似的东西spprint可能会比pformat(如中c)更好。
yee379

6
pprint.pformat()在该页面上。
Gareth Latty

27
@Lattywayre-并非每个提出这样问题的人都跳过了文档。我阅读了相同的文档,也错过了pformat。在stackoverflow上,您有时还会从其他人的经验中获得一些根本不在文档中的瑰宝。谢谢yee379提出这个问题。
Mnebuerquox 2014年

Answers:


209

使用pprint.pformat得到一个字符串,然后将其发送到您的日志框架。

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
如果您在调试完成后没有删除此代码,则可能应该使用“ if Logger.isEnabledFor(logging.DEBUG):”对其进行保护,以避免在不使用其输出文档
Ed Brannin

1
@EdBrannin pformat是否会增加这么多开销,是否值得将条件语句添加到所有DEBUG日志语句中?
undefinedvariable

2
@undefinedvariable好问题。我今天要告诉我2年前,生成一些A / B绩效指标。
埃德Brannin

1
AttributeError: 'function' object has no attribute 'pformat'知道为什么吗?
JinSnow

3
解决方案:from pprint import pprint,pformat 那么我需要logging.debug((pformat(stuff))
JinSnow

20

上述解决方案没有相当,因为我还使用格式化的时候记录添加名称和levelname削减对我来说。看起来有点不整洁:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

可能有一个更优雅的解决方案,但这是:

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)

产生更好的东西:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

14
更适合人类食用。如果要将日志传送到logstash或类似工具,并希望将一条多行消息作为一条消息发送,则效果不是很好。
查尔斯·达菲

5
有没有一种方法可以在记录器配置的处理程序/格式化程序级别进行漂亮的打印?看起来像是一个有效的用例,可以漂亮地打印到控制台,但可以不加格式化地保存到文件中
jon_darkstar 2015年

@CharlesDuffy是否有任何简单的方法来处理这两种情况?
jtlz2

1
最后,我的解决方案是\n在pformat中添加一个额外的字符。至少以这种方式,块在一起。
Ricekab '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.