如何从日志功能中获取消息?

How to get message from logging function?

我有一个来自 logging 包的 logger 函数,在我调用它之后,我可以通过 logging level.

发送消息

我也想将此消息发送到另一个函数,这是一个名为 SendTelegramMsg() 的 Telegram 函数。

如何在调用函数 setup_logger 后获取消息,例如通过 logger.info("Start") 发送消息,然后将完全相同的消息发送到内部的 SendTelegramMsg() 函数setup_logger函数?

我目前的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

调用函数后setup_logger():

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

输出:

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

如果我启用与 True 的集成,我如何才能收到此消息并发送到 SendTelegramMsg()

采纳@gold_cy建议的想法:您实现了一个自定义logging.Handler。一些提示:

  • 为了使处理程序能够通过机器人发送消息,您可能希望将机器人传递给处理程序 __init__ 以便稍后可以使用它
  • emit must be implemented by you. Here you'll want to call format 为您提供日志记录的格式化版本。然后您可以使用该消息通过 bot
  • 发送它
  • 也许看看 StreamHandlerFileHandlerthe implementation 也有帮助
#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')


实施自定义 logging.Handler:

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 name

添加处理程序:

def setup_logger(telegram_integration=False):
    # ...

    if telegram_integration:
        telegram_handler = TelegramHandler()
        logger.addHandler(telegram_handler)

    return logger

用法,无变化:

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