具有自定义处理程序的Python记录器向标准输出

时间:2019-12-06 19:40:41

标签: 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,
            '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)>

当我没有设置root logger时,也注意到了,bot logger不会发送给std。所以这些都以某种方式联系在一起,但是我无法弄清楚到底是怎么回事。

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要将漫游器记录器上的propagate属性设置为False

因此,在其设置中的某个位置添加logger_bot.propagate = False,这将导致每个日志仅由其自己的处理程序处理。