卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34367本站已运行393

使用单个文件的 Python 日志记录(函数名、文件名、行号)

使用单个文件的 python 日志记录(函数名、文件名、行号)

问题内容

我正在尝试了解应用程序的工作原理。为此,我将调试命令插入作为每个函数主体的第一行,目的是记录函数的名称以及向日志输出发送消息的行号(代码内)。最后,由于这个应用程序由许多文件组成,我想创建一个日志文件,以便我可以更好地理解应用程序的控制流。

这是我所知道的:

  1. 为了获取函数名称,我可以使用 function_name.__name__ 但我不想使用 function_name (这样我就可以快速复制并粘贴通用的 Log.info("Message") 到正文中所有功能)。我知道这可以使用 __func__ 宏在 C 中完成,但我不确定 python。

  2. 为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用 Python locals() 函数,但使用的语法我并不完全了解,例如: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals()) 我尝试使用 LOG.info("My message %s" % locals()) 来生成类似 的内容{'self': <__main__.class_name>}。对此有任何输入吗?

  3. 我知道如何使用日志记录并向其添加处理程序以记录到文件,但我不确定是否可以使用单个文件以项目中函数调用的正确顺序记录所有日志消息。


正确答案


您在这里有一些无关紧要的问题。

我将从最简单的开始:(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; 行,进入 pdb 交互式调试提示符。 pdb.set_trace() 中,并重新运行您的程序。这使您能够逐步执行代码,根据您的选择检查数据。

卓越飞翔博客
上一篇: 当 Go 将切片移动到内存中的另一个位置时,指向元素的指针会发生什么?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏