【问题标题】:Python logger with custom handler emits to std带有自定义处理程序的 Python 记录器发送到 std
【发布时间】:2019-12-06 19:40:41
【问题描述】:

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

还注意到,当我不设置根记录器时,机器人记录器不会发送到 std。所以这些以某种方式联系在一起,但我无法弄清楚到底发生了什么。

谢谢。

【问题讨论】:

    标签: python logging python-logging


    【解决方案1】:

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

    所以在它的设置中添加logger_bot.propagate = False,这应该会导致每个日志只能由其自己的处理程序处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 2015-10-17
      • 2023-04-11
      • 2010-09-25
      • 2017-01-08
      • 2021-07-20
      • 1970-01-01
      相关资源
      最近更新 更多