[英]Logging to console for child loggers is enabled only after logging from root logger in python
[英]Logging from a child module ignores the added root logger stream handler
我的目標是將日志消息從特定功能重定向到文件中。 此功能在另一個模塊中定義。 我將StreamHandler添加到主記錄器,但來自child_call函數的消息未按預期保存到tmp.log 。
# main.py
import logging
import os
import sys
from child_logger import child_call
logging.basicConfig(format='%(name)s:%(filename)s:%(lineno)d:%(message)s',
level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger(__name__)
logger.info('here it is')
with open('tmp.log', 'w') as f:
logger_stream_handler = logging.StreamHandler(stream=f)
logger_stream_handler.setLevel(logging.INFO)
logger.addHandler(logger_stream_handler)
logger.info('I am outer')
child_call()
logger.removeHandler(logger_stream_handler)
# child_logger.py
import logging
logger = logging.getLogger(__name__)
def child_call():
logger.info('I am inner')
這是輸出:
%python logger_test.py
__main__:logger_test.py:18:here it is
__main__:logger_test.py:25:I am outer
child_logger:child_logger.py:9:I am inner
%cat tmp.log
I am outer
我期待在tmp.log中看到'我內心'。 據我所知,日志模塊有一個Logger對象的層次結構,默認情況下來自子節點的消息應該傳播到根Logger,root應該處理所有消息。 我錯過了什么?
問題是您的記錄器沒有正確鏈接。 他們需要具有相同的根名稱。 例如:
# main.py
logger = logging.getLogger("parent")
# child_logger.py
logger = logging.getLogger("parent.child")
這兩個日志檢索只需要一個帶有__name__
的記錄器,它被設置為模塊的名稱,除了頂層,它得到“__main__”。 你最終得到的相當於:
# main.py
logger = logging.getLogger("__main__")
# child_logger.py
logger = logging.getLogger("child_logger")
您需要強制執行公共父日志記錄名稱方案以創建正確的記錄器繼承層次結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.