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.

¿Cómo obtener un mensaje de la función de registro?

Tengo una función logger del paquete logging que después de llamarla, puedo enviar el mensaje a través de logging level.

Me gustaría enviar este mensaje también a otra función, que es una función de Telegram llamada SendTelegramMsg().

¿Cómo puedo obtener el mensaje después de llamar a la función setup_logger, enviar un mensaje a través de logger.info("Start") por ejemplo, y luego enviar este mismo mensaje exactamente a la función SendTelegramMsg() que está dentro de la función setup_logger?

Mi función setup_logger actualmente es la siguiente:

# Define el nivel de registro y el nombre del archivo
def setup_logger(telegram_integration=False):
    """Para configurar tantos registros como desee"""

    nombre_archivo = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), 'logs', str(dt.date.today()) + '.log')
    formateador = logging.Formatter('%(levelname)s: %(asctime)s: %(message)s', datefmt='%m/%d/%Y %H:%M:%S')
    nivel = logging.DEBUG

    manejador = logging.FileHandler(nombre_archivo, 'a')
    manejador.setFormatter(formateador)

    manejador_consola = logging.StreamHandler()
    manejador_consola.setFormatter(formateador)

    logger = logging.getLogger('logs')
    if logger.hasHandlers():
        # El logger ya está configurado, eliminar todos los manejadores
        logger.handlers = []
    else:
        logger.setLevel(nivel)
        logger.addHandler(manejador)
        logger.addHandler(manejador_consola)

    #if telegram_integration == True:
        #SendTelegramMsg(aquí va el mensaje)

    return logger

Después de llamar a la función setup_logger():

logger = setup_logger()
logger.info('Start')

La salida:

INFO: 01/06/2022 11:07:12: Start

¿Cómo puedo obtener este mensaje y enviarlo a SendTelegramMsg() si habilito la integración en True?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para enviar el mensaje a la función SendTelegramMsg() dentro de la función setup_logger(), puedes crear una clase de manipulador de registro personalizada que herede de logging.Handler. La clase de manipulador personalizada debe sobrescribir el método emit(), donde puedes obtener el mensaje y pasarlo como argumento a la función SendTelegramMsg().

    Aquí tienes un ejemplo de código para la clase de manipulador de registro personalizada:

    class TelegramLoggingHandler(logging.Handler):
        def __init__(self):
            logging.Handler.__init__(self)
    
        def emit(self, record):
            log_entry = self.format(record)
            SendTelegramMsg(log_entry)  # pasar el mensaje del registro a la función SendTelegramMsg()
    

    Después de definir la clase de manipulador de registro personalizada, puedes modificar la función setup_logger() para agregar una instancia del manipulador personalizado al registro:

    def setup_logger(telegram_integration=False):
        # ...
        telegram_handler = None
        if telegram_integration:
            telegram_handler = TelegramLoggingHandler()  # crear una instancia del manipulador de registro personalizado
        # ...
        logger.addHandler(telegram_handler)  # agregar el manipulador personalizado al registro
        # ...
        return logger
    

    Con esta modificación, cuando telegram_integration esté establecido como True, el registro agregará el manipulador personalizado a su lista de manipuladores. Cada vez que se emita un registro del registro, se llamará al método emit() del manipulador personalizado, que a su vez llamará a la función SendTelegramMsg() con el mensaje del registro formateado como argumento.

    Entonces, cuando llames a la función setup_logger() con telegram_integration=True, de esta manera:

    logger = setup_logger(telegram_integration=True)
    logger.info("Start")
    

    El mensaje de registro “Start” se enviará tanto al archivo de registro como a la función SendTelegramMsg().

Comments are closed.