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

yee*_*379 84 python logging pprint

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

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

rob*_*ert 177

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

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
Run Code Online (Sandbox Code Playgroud)

  • 如果在完成调试后没有删除此代码,则应该使用"if Logger.isEnabledFor(logging.DEBUG):"来保护它,以避免在不使用其输出时运行pformat:http:// docs.python.org/2/library/logging.html#logging.Logger.isEnabledFor (8认同)
  • 解决方案:我需要`来自pprint import pprint,pformat`然后`logging.debug((pformat(stuff))` (3认同)
  • `logging.debug("%s", pformat(ds))` 不会避免 `pformat` 调用。该格式仅意味着,如果禁用调试日志记录,则不会通过使用其他参数格式化模板字符串来创建新字符串。如果是函数调用的结果,则参数本身将被评估。 (3认同)
  • @EdBrannin pformat 是否增加了那么多的开销,值得将条件添加到所有 DEBUG 日志语句的麻烦? (2认同)
  • @undefinedvariable好问题.我今天想告诉我2年前生成一些A/B性能指标. (2认同)

小智 16

上面的解决方案并没有完全消除它,因为我还使用格式化程序在记录时添加名称和级别名称.它看起来有点凌乱:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Run Code Online (Sandbox Code Playgroud)

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

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)
Run Code Online (Sandbox Code Playgroud)

产生一些更好的东西:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Run Code Online (Sandbox Code Playgroud)

  • 更适合人类消费.如果您将日志发送到logstash或类似工具,并希望将单个多行消息发送为一条消息,那就不那么好了. (11认同)
  • Fwiw 我的解决方案是在 pformat 中添加一个额外的 `\n` 字符。至少这样块是在一起的。 (6认同)
  • 有没有办法在记录器配置的处理程序/格式化程序级别打印?看起来像一个有效的用例,可以打印到控制台,但是没有格式化为文件 (4认同)

Bri*_*lie 11

json.dumps另一种方法是与arg 一起使用indent。在某些情况下(取决于日志记录格式、数据大小等),它可能会为您提供更好的输出。

logging.error('Malformed input data!')
logging.error(pformat(foo))

ERROR:root:Malformed input data!
ERROR:root:{'a': 1, 'b': 2, 'c': 'womp rat', 'd': 'turd sandwich'}
Run Code Online (Sandbox Code Playgroud)

logging.error('Malformed input data!') 
logging.error(json.dumps(foo, indent=4))

ERROR:root:Malformed input data!
ERROR:root:{
    "a": 1,
    "b": 2,
    "c": "womp rat",
    "d": "turd sandwich"
}
Run Code Online (Sandbox Code Playgroud)