带有自定义处理程序的Python记录器发送到std

带有自定义处理程序的Python记录器发送到std,python,logging,python-logging,Python,Logging,Python Logging,我已经创建了一个带有自定义处理程序的记录器,它通过bot向电报发送消息。它可以工作,但由于某种原因,消息也会被发送到stderr(或stdout) 我的代码: class TelegramHandler(logging.Handler): def emit(self, record): log_entry = self.format(record) payload = { 'chat_id': TELEGRAM_CHAT_ID,

我已经创建了一个带有自定义处理程序的记录器,它通过bot向电报发送消息。它可以工作,但由于某种原因,消息也会被发送到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)>

还注意到,当我没有设置根记录器时,bot记录器不会发送到std。所以它们以某种方式连接在一起,但我无法确切了解到底发生了什么

谢谢。

您需要将机器人记录器上的属性设置为
False

因此,在设置中为日志添加
logger\u bot.propagate=False
,这将导致每个日志仅由其自己的处理程序处理