我正在尝试了解应用程序的工作原理。为此,我将调试命令插入作为每个函数主体的第一行,目的是记录函数的名称以及向日志输出发送消息的行号(代码内)。最后,由于这个应用程序由许多文件组成,我想创建一个日志文件,以便我可以更好地理解应用程序的控制流。
这是我所知道的:
-
为了获取函数名称,我可以使用function_name.__name__
但我不想使用 function_name (这样我就可以快速复制并粘贴通用的Log.info("Message")
在所有函数体内)。我知道这可以在 C 中使用来完成__func__
宏,但我不确定 python 。
-
为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用 Pythonlocals()
函数,但语法我并不完全了解,例如:options = "LOG.debug('%(flag)s : %(flag_get)s' % locals())
我尝试使用类似LOG.info("My message %s" % locals())
这会产生类似的东西{'self': <__main__.Class_name object at 0x22f8cd0>}
。请问对此有何意见?
-
我知道如何使用日志记录并向其添加处理程序以记录到文件,但我不确定是否可以使用单个文件以项目中函数调用的正确顺序记录所有日志消息。
正确的答案是使用已经提供的funcName https://docs.python.org/2/library/logging.html#logrecord-attributes多变的
import logging
logger = logging.getLogger(__name__)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
logging.basicConfig(format=FORMAT)
logger.setLevel(logging.DEBUG)
然后在任何你想要的地方添加:
logger.debug('your message')
我现在正在处理的脚本的输出示例:
[invRegex.py:150 - handleRange() ] ['[A-Z]']
[invRegex.py:155 - handleRepetition() ] [[<__main__.CharacterRangeEmitter object at 0x10ba03050>, '{', '1', '}']]
[invRegex.py:197 - handleMacro() ] ['\\d']
[invRegex.py:155 - handleRepetition() ] [[<__main__.CharacterRangeEmitter object at 0x10ba03950>, '{', '1', '}']]
[invRegex.py:210 - handleSequence() ] [[<__main__.GroupEmitter object at 0x10b9fedd0>, <__main__.GroupEmitter object at 0x10ba03ad0>]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)