我正在尝试了解应用程序的工作原理。为此,我将调试命令插入作为每个函数主体的第一行,目的是记录函数的名称以及向日志输出发送消息的行号(代码内)。最后,由于这个应用程序由许多文件组成,我想创建一个日志文件,以便我可以更好地理解应用程序的控制流。
这是我所知道的:
为了获取函数名称,我可以使用 function_name.__name__
但我不想使用 function_name (这样我就可以快速复制并粘贴通用的 Log.info("Message")
到正文中所有功能)。我知道这可以使用 __func__
宏在 C 中完成,但我不确定 python。
为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用 Python locals()
函数,但使用的语法我并不完全了解,例如: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals())
我尝试使用 LOG.info("My message %s" % locals())
来生成类似 的内容{'self': 9f80b6a9b02e2f6bd3a3a454f4c1763b}
。对此有任何输入吗?
我知道如何使用日志记录并向其添加处理程序以记录到文件,但我不确定是否可以使用单个文件以项目中函数调用的正确顺序记录所有日志消息。
您在这里有一些无关紧要的问题。
我将从最简单的开始:(3)。使用 logging
您可以将所有调用聚合到单个日志文件或其他输出目标:它们将按照进程中发生的顺序排列。
下一步:(2)。 locals()
提供当前范围的字典。因此,在没有其他参数的方法中,作用域中有 self
,其中包含对当前实例的引用。所使用的让您感到困惑的技巧是使用字典作为 %
运算符的 rhs 的字符串格式。 "%(foo)s" % bar
将被替换为 bar["foo"]
的值。
最后,您可以使用一些自省技巧,类似于 pdb
使用的那些可以记录更多信息的技巧:
def autolog(message): "Automatically log the current function details." import inspect, logging # Get the previous frame in the stack, otherwise it would # be this function!!! func = inspect.currentframe().f_back.f_code # Dump the message + the name of this function to the log. logging.debug("%s: %s in %s:%i" % ( message, func.co_name, func.co_filename, func.co_firstlineno ))
这将记录传入的消息,加上(原始)函数名称、定义所在的文件名以及该文件中的行。有关更多详细信息,请参阅inspect - 检查活动对象。
正如我之前在评论中提到的,您还可以随时插入 import pdb; 行,进入 <code>import pdb; 行,进入 <code>pdb
交互式调试提示符。 pdb.set_trace() 交互式调试提示符。 pdb.set_trace() 中,并重新运行您的程序。这使您能够逐步执行代码,根据您的选择检查数据。
以上是使用单个文件的 Python 日志记录(函数名、文件名、行号)的详细内容。更多信息请关注PHP中文网其他相关文章!