python - 为什么 python 的日志记录接口(interface)与 print 的不同?

标签 python python-3.x logging

我喜欢 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/

相关文章:

python libusb1 : asynchronous TRANSFER_NO_DEVICE status just after successful syncronous transfers

python-3.x - 如何检查Python程序运行时使用了多少内存

python - 列表索引超出范围 - 但我在处理之前检查长度

java - 在处理开始时而不是在结束时调用 MDC.clear() 有什么缺点吗?

python - 相当于 Python 生成器的 `return`

python - 电子邮件附件保存

python-3.x - 如何将Excel负值转换为Pandas负值

php - 解析原始 apache 日志

python - 如何让多个处理程序使用日志?

python - 在 Python 中查找两个列表/数组中最近的项目