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