Registro de eventos en Python; ¿Cómo registrar eventos dentro de las clases?
-
08-07-2019 - |
Pregunta
Creé (solo por diversión) 3 clases para ayudarme a registrar algunos eventos en mi trabajo.
aquí están ellos:
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)
Aquí está mi pregunta:
Imagine que tengo otras clases, como Empleado, y quiero registrar un evento que sucedió DENTRO de esa clase.
¿Cómo puedo hacer eso sin pasar siempre una instancia de logHandler a todas las demás clases que deseo registrar? Mi idea sería pasar un logHandler a cada función init , y luego usarlo dentro de él.
¿Cómo se puede hacer eso, sin hacer lo que especifiqué?
¿Cómo funcionaría con logHandler global? ¿Hay alguna manera de descubrir en tiempo de ejecución si hay una instancia de logHandler en el programa y usarla para crear los mensajes?
Gracias
Solución
Simplemente cree una instancia de sus clases en el módulo que publicó. Luego solo importe su módulo de registro en cada archivo desde el que desee iniciar sesión y haga algo como esto:
yourloggingmodule.handler.newLogMessage(...)
Donde handler
es el nombre de la instancia que creó.
Otros consejos
Puede usar el Patrón Borg , lo que significa que puede crear instancias locales de su registrador objeto y, sin embargo, que accedan al mismo estado. Algunos dirían que es elegante, otros pueden decir que es confuso. Tú decides. :)