在Python中记录事件;如何在类内部记录事件?

0 投票
2 回答
1607 浏览
提问于 2025-04-15 15:27

我为了好玩,做了三个类来帮助我记录工作中的一些事件。

这三个类就是:

class logMessage:

    def __init__(self,objectName,message,messageType):
        self.objectName = objectName
        self.message = message
        self.messageType = messageType
        self.dateTime = datetime.datetime.now()

    def __str__(self):
        return str(self.dateTime) + "\nObjeto de valor " + str(self.objectName) + " gerou uma mensagem do tipo: " + self.messageType + "\n" + self.message + "\n"

class logHandler():

    def __init__(self):
        self.messages = []

    def __getitem__(self,index):
        return self.messages[index]

    def __len__(self):
        return len(self.messages)

    def __str__(self):
        colecaoString = ""
        for x in self.messages:
            colecaoString += str(x) + "\n"

        return colecaoString

    def dumpItem(self,index):
        temp = self.messages[index]
        del self.messages[index]
        return str(temp)

    def append(self,log):
        if isinstance(log,logMessage.logMessage):
            self.messages.append(log)
        else:
            self.newLogMessage(log, "Wrong object type. Not a log message. Impossible to log.","Error")

    def newLogMessage(self,objectInstance,message,messageType):
        newMessage = logMessage.logMessage(objectInstance,message,messageType)
        self.append(newMessage)

我有个问题:

假设我还有其他类,比如员工类(Employee),我想记录在这个类里面发生的事件。

我该怎么做,才能不每次都把一个日志处理器(logHandler)传给我想记录日志的每个类呢?我想的办法是把日志处理器传给每个初始化函数,然后在里面使用它。

有没有其他方法可以做到这一点,而不需要我之前提到的那样?

如果使用全局的日志处理器,这样能行吗?有没有办法在程序运行时检查是否有日志处理器的实例,并用它来创建日志信息?

谢谢!

2 个回答

1

你可以使用一种叫做 Borg模式 的方法。这种方法的意思是,你可以创建多个本地的日志记录器实例,但它们可以共享同样的状态。有些人觉得这样很优雅,而有些人则觉得有点复杂。你自己来判断吧。:)

1

只需要在你发布的模块中创建一个你类的实例。然后在你想要记录日志的每个文件中导入你的日志模块,接着像这样做:

yourloggingmodule.handler.newLogMessage(...)

这里的 handler 是你创建的实例的名字。

撰写回答