【发布时间】:2020-01-03 22:00:07
【问题描述】:
我正在尝试使用 LogRecordFactory 在我的日志记录中添加一个自定义字段。我反复调用一个类,每次我这样做时,我都想在 init 模块中设置 custom_attribute ,以便类中的其余代码将具有此属性。但我无法让它发挥作用。我发现以下内容有效,但它是静态的。
import logging
old_factory = logging.getLogRecordFactory()
def record_factory(*args, **kwargs):
record = old_factory(*args, **kwargs)
record.custom_attribute = "whatever"
return record
logging.basicConfig(format="%(custom_attribute)s - %(message)s")
logging.setLogRecordFactory(record_factory)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
这将正确输出:
whatever - test
但是,我的用例是 custom_attribute 会有所不同。每次我调用一个特定的函数时,我都想改变它。因此,似乎 record_factory 需要传递给它的另一个参数,以便它可以使用新参数返回正确的记录。但我想不通。我尝试向函数添加参数,但是当我调用时,我得到:
TypeError: __init__() missing 7 required positional arguments: 'name', 'level', 'pathname', 'lineno', 'msg', 'args', and 'exc_info'
我认为这与 *args 和 **kwargs 有关,但我真的不知道。另外,为什么在logging.setLogRecordFactory调用record_factory之后没有括号?我从未见过这样的函数。
【问题讨论】:
标签: python-3.x logging