python 作为函数的调用方生成日志

rjee0c15  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(119)
  • 是否有方法记录消息,就好像它们来自当前函数的调用者?*

我有一个非常简单的全局日志记录工具,它通过__main__初始化为

logformat = '%(asctime)s %(levelname)s %(module)s:%(funcName)s:%(lineno)d - %(message)s'
logging.basicConfig(format=logformat, level=loglevel)

然后,所有函数通过

# Goes directly to the global logger
logging.warning('this might not work')

一些实用程序函数发出日志,但是%(module)s:%(funcName)s:%(lineno)d解析为helpers:my_helper_fn:42是没有帮助的,而触发日志的my_helper_fn的调用者是有趣的部分。
有没有办法在my_helper_fn中记录消息,以便funcName和朋友自动解析为my_helper_fn的调用者?理想情况下,我会用@logAsCaller之类的东西来修饰my_helper_fn ...
有一个logger.findCaller似乎是有目的地为此而设计的,我不能从文档中推断出它应该如何使用。

hgb9j2n6

hgb9j2n61#

  • 有一个logger.findCaller似乎是专门为此设计的,但我无法从文档中推断出它应该如何使用。*

差不多。这确实是记录器查找它应该在其消息中使用的调用方的方式,但用户代码无法访问此方法。
但doc中对于logger.debug描述了stacklevel关键字唯一的参数(强调矿):
...第三个可选关键字参数为stacklevel,默认值为1。如果大于1,则在计算为日志事件创建的LogRecord中设置的行号和函数名时,将跳过相应数量的堆栈帧。这可用于日志助手,以便记录的函数名、文件名和行号不是助手函数/方法的信息。而是它的调用者
所有其他日志记录方法的文档都说它们支持与debug相同的参数。
因此,您只需用途:

# Goes directly to the global logger
logging.warning('this might not work', stacklevel=2)

相关问题