Python 带有自定义处理程序的记录器发送到标准
Python logger with custom handler emits to std
我创建了一个带有自定义处理程序的记录器,它通过机器人向电报发送消息。它有效,但由于某种原因,该消息也被发送到 stderr(或 stdout)。
我的代码:
class TelegramHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
payload = {
'chat_id': TELEGRAM_CHAT_ID,
'text': log_entry,
'parse_mode': 'HTML'
}
return requests.post("https://api.telegram.org/bot{token}/sendMessage".format(token=TELEGRAM_TOKEN),
data=payload).content
# setting up root logger
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.WARNING)
# setting up my logger
logger_bot = logging.getLogger('bot')
handler = TelegramHandler()
logger_bot.addHandler(handler)
logger_bot.setLevel(logging.DEBUG)
以及以下代码:
logger_bot.info('bot test')
logging.warning('root test')
结果
2019-12-06 22:24:14,401 - bot - INFO - bot test # *(plus message in telegram)*
2019-12-06 22:24:14,740 - root - WARNING - root test
我检查过处理程序
for h in logger_bot.handlers:
print(h)
而且只有一个
<TelegramHandler (NOTSET)>
还注意到当我没有设置根记录器时,机器人记录器不会发送到标准。所以这些以某种方式连接,但我无法弄清楚到底发生了什么。
谢谢。
您需要将机器人记录器的 propagate 属性设置为 False
。
因此在它的设置中的某处添加 logger_bot.propagate = False
,这应该会导致每个日志仅由其自己的处理程序处理。
我创建了一个带有自定义处理程序的记录器,它通过机器人向电报发送消息。它有效,但由于某种原因,该消息也被发送到 stderr(或 stdout)。
我的代码:
class TelegramHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
payload = {
'chat_id': TELEGRAM_CHAT_ID,
'text': log_entry,
'parse_mode': 'HTML'
}
return requests.post("https://api.telegram.org/bot{token}/sendMessage".format(token=TELEGRAM_TOKEN),
data=payload).content
# setting up root logger
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.WARNING)
# setting up my logger
logger_bot = logging.getLogger('bot')
handler = TelegramHandler()
logger_bot.addHandler(handler)
logger_bot.setLevel(logging.DEBUG)
以及以下代码:
logger_bot.info('bot test')
logging.warning('root test')
结果
2019-12-06 22:24:14,401 - bot - INFO - bot test # *(plus message in telegram)*
2019-12-06 22:24:14,740 - root - WARNING - root test
我检查过处理程序
for h in logger_bot.handlers:
print(h)
而且只有一个
<TelegramHandler (NOTSET)>
还注意到当我没有设置根记录器时,机器人记录器不会发送到标准。所以这些以某种方式连接,但我无法弄清楚到底发生了什么。
谢谢。
您需要将机器人记录器的 propagate 属性设置为 False
。
因此在它的设置中的某处添加 logger_bot.propagate = False
,这应该会导致每个日志仅由其自己的处理程序处理。