[英]How to avoid root handler being called from the custom logger in 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)>
還注意到當我不設置根記錄器時,bot 記錄器不會發送到 std。 所以這些是以某種方式連接的,但我無法弄清楚到底發生了什么。
謝謝你。
您需要將機器人記錄器上的傳播屬性設置為False
。
因此,在設置中的某處添加logger_bot.propagate = False
,這應該會導致每個日志僅由其自己的處理程序處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.