Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 日志记录:记录类实例化的位置_Python_Oop_Logging - Fatal编程技术网

Python 日志记录:记录类实例化的位置

Python 日志记录:记录类实例化的位置,python,oop,logging,Python,Oop,Logging,我想记录跨脚本的所有文件写入操作,并且我想知道哪个方法/类进行了写入操作。例如,我有这个代码 import logging logger = logging.getLogger('root') #FORMAT = "[%(filename)s:%(funcName)20s() ] %(message)s" #logging.basicConfig(format=FORMAT) logger.setLevel(logging.DEBUG) class FileWrite: def _

我想记录跨脚本的所有文件写入操作,并且我想知道哪个方法/类进行了写入操作。例如,我有这个代码

import logging

logger = logging.getLogger('root')
#FORMAT = "[%(filename)s:%(funcName)20s() ] %(message)s"
#logging.basicConfig(format=FORMAT)
logger.setLevel(logging.DEBUG)


class FileWrite:
    def __init__(self,filename):
        self.filename = filename
        self.f = open(filename,'w')

    def __enter__(self):
        return self.f

    def __exit__(self):
        self.f.close()
        logger.debug("Write to: {}".format(self.filename))
当我运行这样的代码时,我希望能够记录哪个方法进行了写操作

class A:
    def a():
        with FileWrite("file.txt") as f:
            f.write("something")

应该记录“file.txt”是通过方法
A.A

编写的,这是您通常不应该做的事情之一……但有时它是有意义的。我不确定你的案子是否合格,但我会告诉你怎么做

您要查找的是有关调用当前帧的函数的信息。在
inspect
中,文档显示了如何获取此信息:

frame = inspect.currentframe()
caller = frame.f_back
name = caller.f_code.co_name
需要注意的几件事:

  • 这将为您提供代码对象的名称,即用作
    def
    time的名称,该名称可能与调用函数的名称不同。重要的是,在您的情况下,在
    def
    时间,这只是一个函数,
    a
    ,而不是一个方法,
    a.a
    ,因此您不会得到后者。(请注意,回溯打印裸函数名称的方式与打印裸函数名称的方式相同,因为它们具有与此处相同的信息。)
  • 您还可以获得诸如文件名和行号之类的信息(同样,这些信息将在
    def
    语句中出现),并且
    inspect
    模块可以获得更多信息
  • 在某些情况下,
    inspect.stack(1)[1]
    返回的“帧记录”可能有更多的“运行时-y”,而不是定义时间信息,但通常不是这样。(大部分信息直接从帧属性中提取,但其中一些信息被从源代码中提取的信息覆盖(如果可用)。有关详细信息,请参阅。)例如,您可以查看
    inspect.stack(1)[2][4]
    以获取源代码行
    my_A_instance.A()
    ,您可能会对此感兴趣
  • 这需要Python3.4。如果您使用的是3.3或更早版本,只要您只关心CPython,
    caller=sys.\u getframe(1)
    就可以有效地替换前两行
  • 如果您的应用程序是多线程(或绿色线程),则在调用任何慢速/阻塞操作之前,您可能需要显式地
    del
    .clear()
    帧对象,如
    logger.debug
不过,这可能会对您有所帮助。