我喜欢 Python 的 print
函数的界面:
print("abc %d %s" % (12, "sdf"), 78, "some other string")
但是,当我使用默认的 logging
包进行日志记录时,界面有所不同:
logger.info("abc %d %s 78 some other string", 12, "sdf")
它们不一致有什么原因吗?是否可以让 logging
logger
表现得像 print
一样?
最佳答案
TL;DR:让记录器格式化消息比您自己格式化消息有一些优点。对于print
则没有这样的优势,所以最好有更方便的接口(interface)。
您首先看到的是函数签名不同。 print 函数接受任意多个位置参数,并将它们全部打印出来。在您的示例中,您向 print 发送了 3 个位置参数,它们由空格连接。
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
记录器函数接受消息的一个位置参数,以及在该消息中替换的任意多个模板变量,例如:
logger.info(msg, *args, **kwargs)
Is there any reason they are inconsistent?
是的。这里的 print 只是一个函数,与任何其他函数一样,在调用函数参数之前对参数进行完全评估。因此,模板 "abc %d %s"% (12, "sdf")
首先发生。
另一方面,使用记录器,最好让记录器进行模板化/格式化。造成这种情况的原因有几个,但也许最有说服力的一个是日志聚合服务可以轻松地将同类错误分组在一起。来自同一模板、使用不同参数触发的这些错误可以被视为一个整体,而不是生成数千个单独的错误。
关于python - 为什么 python 的日志记录接口(interface)与 print 的不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42118802/