我喜欢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
一样?
答案 0 :(得分:2)
TL; DR:让记录器格式化消息有一些优点,而不是自己格式化。对于print
,没有这样的优势,所以最好有更方便的界面。
您首先看到的是功能签名不同。 print
函数接受任意多个位置参数,并将它们全部打印出来。在您的示例中,您发送了3个位置参数进行打印,并通过空格连接。
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
记录器函数接受消息的一个位置参数,并在该消息中替换任意多个模板变量,例如:
logger.info(msg, *args, **kwargs)
他们有什么不一致的原因吗?
是。这里print
只是一个函数,和任何其他函数一样,在调用函数参数之前完全评估参数。因此,模板"abc %d %s" % (12, "sdf")
首先发生。
另一方面,使用记录器最好让记录器进行模板化/格式化。这有几个原因,但最有说服力的可能是日志聚合服务可以轻松地将相同类型的错误组合在一起。使用不同参数触发的同一模板中的错误可以看作是一个整体 - 而不是产生数以千计的个别错误。