Hola
Me gustaría extender mi registrador (tomada por logging.getLogger ("rrcheck")) con mis propios métodos como: def warnpfx(...):
Cómo escribir propios métodos de registro para propios niveles de registro
cómo hacerlo lo mejor?
Mi deseo original es tener un registrador de la raíz escribir todo a un archivo y, además, nombrado registrador ("rrcheck") escrito por la salida estándar, pero éste también debe tener algunos otros métodos y niveles. Necesito preceder algunos mensajes con el prefijo "! PFXWRN" (pero solo aquellos que van a stdout) y dejar otros mensajes sin cambios. También me gustaría configurar el nivel de registro por separado para root y para el registrador con nombre.
Este es mi código:
class CheloExtendedLogger(logging.Logger):
"""
Custom logger class with additional levels and methods
"""
WARNPFX = logging.WARNING+1
def __init__(self, name):
logging.Logger.__init__(self, name, logging.DEBUG)
logging.addLevelName(self.WARNPFX, 'WARNING')
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter("%(asctime)s [%(funcName)s: %(filename)s,%(lineno)d] %(message)s")
console.setFormatter(formatter)
# add the handlers to logger
self.addHandler(console)
return
def warnpfx(self, msg, *args, **kw):
self.log(self.WARNPFX, "! PFXWRN %s" % msg, *args, **kw)
logging.setLoggerClass(CheloExtendedLogger)
rrclogger = logging.getLogger("rrcheck")
rrclogger.setLevel(logging.INFO)
def test():
rrclogger.debug("DEBUG message")
rrclogger.info("INFO message")
rrclogger.warnpfx("warning with prefix")
test()
Y esto es una salida - la función y el número lilne es falso: warnpfx en lugar de prueba
2011-02-10 14:36:51,482 [test: log4.py,35] INFO message
2011-02-10 14:36:51,497 [warnpfx: log4.py,26] ! PFXWRN warning with prefix
Tal vez mi propio enfoque Logger es no el mejor?
¿Qué dirección propondrías ir (propio registrador, manejador propio, formateador propio, etc.)?
¿Cómo proceder si quisiera tener otro registrador?
Desafortunadamente registro no tiene la posibilidad de registrar un registrador propia, por lo que entonces getLogger (nombre) tomaría un ser requerida ...
Saludos,
Zbigniew
Gracias DzinX. Hice algunos intentos más y parece que llamar a self._log en lugar de self.log lo hace funcionar. – Zbigniew
Aaah, eso es porque 'currentframe()' devuelve la cuarta función superior en la pila de llamadas :) Qué feo de ellos :) – DzinX