Tengo una función de logger del paquete de logging que, después de llamarlo, puedo enviar el mensaje a través del 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 recibir el mensaje después de llamar a la setup_logger enviar un mensaje a través logger.info("Start") por ejemplo, y luego enviar exactamente el mismo mensaje a la función SendTelegramMsg() que está dentro de la función setup_logger ?
Mi función actualmente setup_logger :
# Define the logging level and the file name def setup_logger(telegram_integration=False): """To setup as many loggers as you want""" filename = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), 'logs', str(dt.date.today()) + '.log') formatter = logging.Formatter('%(levelname)s: %(asctime)s: %(message)s', datefmt='%m/%d/%Y %H:%M:%S') level = logging.DEBUG handler = logging.FileHandler(filename, 'a') handler.setFormatter(formatter) consolehandler = logging.StreamHandler() consolehandler.setFormatter(formatter) logger = logging.getLogger('logs') if logger.hasHandlers(): # Logger is already configured, remove all handlers logger.handlers = [] else: logger.setLevel(level) logger.addHandler(handler) logger.addHandler(consolehandler) #if telegram_integration == True: #SendTelegramMsg(message goes here) 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 recibir este mensaje y enviarlo a SendTelegramMsg() si habilito la integración en True ?
Implemente un logging.Handler personalizado:
class TelegramHandler(logging.Handler): def emit(self, record): message = self.format(record) SendTelegramMsg(message) # SendTelegramMsg(message, record.levelno) # Passing level # SendTelegramMsg(message, record.levelname) # Passing level nameAgregue el controlador:
def setup_logger(telegram_integration=False): # ... if telegram_integration: telegram_handler = TelegramHandler() logger.addHandler(telegram_handler) return loggerUso, sin cambios:
logger = setup_logger() logger.info("Start")Retomando la idea sugerida por @gold_cy: implementa un logging.Handler personalizado. Algunos consejos para eso:
__init__ para que esté disponible más adelanteemit debe ser implementado por usted. Aquí querrá llamar al format que le da una versión formateada del registro. Luego puede usar ese mensaje para enviarlo a través del botStreamHandler y FileHandler#Defining a global flag tlInt=False # Define the logging level and the file name def setup_logger(telegram_integration=False): """To setup as many loggers as you want""" filename = os.path.join(os.path.sep, pathlib.Path(__file__).parent.resolve(), 'logs', str(dt.date.today()) + '.log') formatter = logging.Formatter('%(levelname)s: %(asctime)s: %(message)s', datefmt='%m/%d/%Y %H:%M:%S') level = logging.DEBUG handler = logging.FileHandler(filename, 'a') handler.setFormatter(formatter) consolehandler = logging.StreamHandler() consolehandler.setFormatter(formatter) logger = logging.getLogger('logs') if logger.hasHandlers(): # Logger is already configured, remove all handlers logger.handlers = [] else: logger.setLevel(level) logger.addHandler(handler) logger.addHandler(consolehandler) if telegram_integration == True: global tlInt tlInt=True return logger #Logic : If telegram integration is true, it will call SendTelegramMsg to send the message to the app based on the level; and if it is false, it will save the message in local file based on the level def GenerateLog(logger,levelFlag,data): global tlInt if tlInt == True: SendTelegramMsg(levelFlag,data) else: if levelFlag == "warning": logger.warning(data) elif levelFlag == "error": logger.error(data) elif levelFlag == "debug": logger.debug(data) elif levelFlag == "critical": logger.critical(data) else: logger.info(data) #You can used the same logic in SendTelegramMsg which used in GenerateLog for deciding the level def SendTelegramMsg(levelFlag,data): #your code goes here logger=setup_logger() GenerateLog(logger,'warning','Start')