如何从日志功能中获取消息?
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 发送它
- 也许看看
StreamHandler
和 FileHandler
的 the 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")
我有一个来自 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 callformat
为您提供日志记录的格式化版本。然后您可以使用该消息通过 bot 发送它
- 也许看看
StreamHandler
和FileHandler
的 the 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")