繁体   English   中英

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

[英]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)>

还注意到当我不设置根记录器时,bot 记录器不会发送到 std。 所以这些是以某种方式连接的,但我无法弄清楚到底发生了什么。

谢谢你。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM