我正在努力弄清楚extra
日志记录的工作原理。我需要更改一些使用它的旧代码,并且这些代码也需要登录到stdout。
import logging
log = logging.getLogger()
handler = logging.Streamhandler(sys.stdout)
handler.setLevel("INFO")
formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')
handler.setFormatter(formatter)
log.addHandler(handler)
log.error("fly you foos!", extra={"City": "Mordor"})
OUTPUT:
2019-10-31 16:19:04,422 | root | ERROR | fly you foos!
上面的记录为fly you foos!
,但对多余的参数没有任何作用。这是有道理的,因为实际上并没有以任何方式使用额外的参数。
但是根据此documentation,我可以更改格式化程序以包括附加的字典键“城市”:
formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s | %(City)s')
OUTPUT:
2019-10-31 16:19:04,422 | root | ERROR | fly you foos! | Mordor
这给了我正确的日志行,但是它也给了我KeyError
,因为我使用log
的其他所有地方现在也都需要字典作为参数了。其中包含键City
。这显然是不可行的,因为它需要更改每个使用的实例log
,添加冗余参数以适合Formatter。
我想知道传统上还有多少额外的用途,或者我还不了解的任何细微差别。理想情况下,我希望每次都看到异常的extra
部分,而不必更改Formatter。