簡體   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