gpt4 book ai didi

python - 改变 python 记录器堆栈级别

转载 作者:行者123 更新时间:2023-12-05 02:16:23 26 4
gpt4 key购买 nike

在编写框架代码时,我经常希望记录调用者 的行号和文件名。例如,如果我检测到对框架级 API 调用的不当使用,我想将其记录下来……不是作为框架内错误,而是作为“调用者错误”。

这仅在编写使用内省(introspection)的低级库和系统时发挥作用。

有没有办法让记录器记录“上一级”?我可以创建自定义 LogRecord 然后修改它并以某种方式在已安装的记录器中使用它吗?试图解决这个问题。

例如这样的事情:

def set(self, x):
if x not in self._cols:
log.error("Invalid attribute for set", stack_level=-1)

最佳答案

这很容易在 google 上找到,因为它被添加到 python 3.8 中,并且在另一个答案中提到过,但这里有一个更好的解释。您接近 stack_level 参数,但它应该是 stacklevel 并且值应该是 2。例如你可以这样做:

import logging

def fun():
logging.basicConfig(format='line %(lineno)s : %(message)s')
log = logging.getLogger(__name__)
log.error('Something is wrong', stacklevel=2)

if __name__ == '__main__':
fun()

这将输出:

line 9 : Something is wrong

如果堆栈级别设置为默认值 1,它将输出:

line 6 : Something is wrong

来自文档:https://docs.python.org/3/library/logging.html#logging.Logger.debug

The third optional keyword argument is stacklevel, which defaults to 1. If greater than 1, the corresponding number of stack frames are skipped when computing the line number and function name set in the LogRecord created for the logging event. This can be used in logging helpers so that the function name, filename and line number recorded are not the information for the helper function/method, but rather its caller. The name of this parameter mirrors the equivalent one in the warnings module.

关于python - 改变 python 记录器堆栈级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49987228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com