当前位置: 首页 > 面试题库 >

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

公羊渝
2023-03-14
问题内容

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

这是我所知道的:

  1. 为了获得函数名,我可以使用,function_name.__name__但我不想使用function_name(这样我就可以Log.info("Message")在所有函数的主体中快速复制并粘贴泛型)。我知道这可以使用__func__宏在C语言中完成,但是我不确定python。

  2. 为了获取文件名和行号,我已经看到(并且我相信)我的应用程序正在使用Pythonlocals()函数,但是语法我不完全了解例如:options = "LOG.debug('%(flag)s : %(flag_get)s' % locals())并且我尝试使用likeLOG.info("My message %s" % locals())产生了类似的东西{'self': <__main__.Class_name object at 0x22f8cd0>}。请问对此有何意见?

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

我将不胜感激任何帮助。

谢谢!


问题答案:

您在这里有一些边际相关的问题。

我将从最简单的开始:(3)。使用,logging您可以将所有调用聚集到一个日志文件或其他输出目标中:它们将按照在处理过程中发生的顺序进行。

接下来:(2)。locals()提供当前范围的指示。因此,在没有其他参数的方法中,您将具有self范围,该范围包含对当前实例的引用。困扰您的技巧是使用字典作为%操作员的RHS的字符串格式。"%(foo)s" % bar将被替换为bar["foo"]is的任何值。

最后,您可以使用一些自省技巧,类似于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
    ))

这将记录传入的消息,以及(原始)函数名称,出现定义的文件名以及该文件中的行。看一下检查-
检查活动对象
以了解更多详细信息。

正如我在前面的评论中所提到的,您还可以pdb随时通过插入行import pdb; pdb.set_trace()并重新运行程序来进入交互式调试提示符。这使您可以逐步检查代码,并根据需要检查数据。



 类似资料:
  • 问题内容: 我正在使用的Web应用程序偶尔会为某些用户带来数据完整性问题。我想打开跟踪级别的日志记录,但是由于我们每秒要处理100个请求,因此每个日志记录都是不可能的。 log4j是否可以有条件地记录日志?换句话说,我希望仅在特定用户发出请求时才能获得跟踪日志。由于我事先不知道哪些用户会受到影响,因此我无法简单地临时对用户名进行硬编码。 编辑: 我想我需要更清楚一点。我可以轻松地在日志语句中添加条

  • 问题内容: 我们有几个同时运行的作业,它们必须为log4j使用相同的配置信息。他们都使用相同的附加程序将日志转储到一个文件中。有没有一种方法可以让每个作业动态命名其日志文件,以使它们保持独立? 谢谢 汤姆 问题答案: 您可以为每个作业传递Java系统属性吗?如果是这样,您可以像这样进行参数化: 然后在您的log4j.properties中: 您可以使用主机环境(例如)中的值填充Java系统属性,该

  • 问题内容: 是否可以装饰/扩展python标准日志记录系统,以便在调用日志记录方法时也将文件和文件的行号记录在调用它的位置,或者也可以记录调用该文件的方法? 问题答案: 当然,请检查日志记录文档中的格式化程序。特别是lineno和pathname变量。 %(pathname)s 发出日志记录调用的源文件 的 完整路径名(如果有)。 %(filename)s 路径名 的 文件名部分。 %(modul

  • 问题内容: 我想使用ElasticSearch搜索文件名(而不是文件的内容)。因此,我需要找到文件名的一部分(完全匹配,没有模糊搜索)。 示例: 我有以下名称的文件: 现在,我要搜索以获取前两个文件。 搜索或应返回除最后一个文件名以外的所有文件名。 如何使用ElasticSearch做到这一点? 这是我测试过的,但始终返回零结果: 问题答案: 您粘贴的内容存在各种问题: 1)不正确的映射 创建索引

  • 有没有办法使用openssl对x509证书或任何文档进行数字签名?

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。