es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prefija los mensajes de registro con datos dependientes del contexto.

Quiero agregar un prefijo a todas las entradas de registro dentro de una clase llamado self.instance_desc. Así:

logging.info(f"({self.instance_desc}) {message}")

Pero no quiero escribir el prefijo en cada mensaje.

¿Cómo puedo hacerlo de forma automática?

Ya hecho:

He agregado un nuevo método a la clase:

def log(message):
    logging.info(f"({self.instance_desc}) Message")

El problema es que %(filename)s:%(lineno)d está apuntando (obviamente) al método log.

¿Es posible hacer esto mientras %(filename)s:%(lineno)d apunta al lugar donde se llama a self.log?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible.

    Puede utilizar un Formatter de registro personalizado para personalizar el formato del registro para su clase.

    Primero, defina el formateador personalizado:

    class CustomFormatter(logging.Formatter):
        def __init__(self, instance_desc):
            super().__init__()
            self.instance_desc = instance_desc
    
        def format(self, record):
            record.msg = f"({self.instance_desc}) {record.msg}"
            return super().format(record)
    

    Este formateador toma como argumento la descripción de la instancia y la coloca como prefijo al mensaje de registro.

    Luego, en su clase, establezca el formateador para el registro:

    class MyClass:
        def __init__(self, instance_desc):
            self.instance_desc = instance_desc
            self.logger = logging.getLogger(__name__)
            handler = logging.StreamHandler()
            formatter = CustomFormatter(instance_desc)
            handler.setFormatter(formatter)
            self.logger.addHandler(handler)
    
        def some_method(self):
            self.logger.info("Some log message")
    

    Ahora, cada vez que llame a self.logger.info(), el formateador personalizado automáticamente colocará el prefijo al mensaje de registro con la descripción de la instancia. Y el %(filename)s:%(lineno)d apuntará al lugar donde se llamó a self.logger.info().

Comments are closed.