[英]Python: How to properly configure logging for a library with dictConfig?
我有一個具有這種結構的項目文件夾:
.
├── myapp.py
└── mypackage
├── __init__.py
└── mymodule.py
現在我想按照文檔( 為庫配置日志記錄)中的描述為mypackage
配置日志記錄,所以我在__init__.py
的頂級記錄器中添加了一個NullHandler
:
import logging
logging.getLogger(__name__).addHandler(logging.NullHandler())
然后在mymodule.py
中生成一個記錄器實例並使用它:
import logging
logger=logging.getLogger(__name__)
def myfunc():
logger.warning('logging from mymodule.py')
在myapp.py
,我像這樣配置記錄器:
import logging
import logging.config
import mypackage.mymodule as mm
if __name__ == '__main__':
LOGGING = {'version': 1}
console_handler = {'class': 'logging.StreamHandler'}
LOGGING['handlers'] = {'console_handler': console_handler}
root_logger = {'handlers': ['console_handler']}
LOGGING['loggers'] = {'': root_logger}
logging.config.dictConfig(LOGGING)
applogger = logging.getLogger(__name__)
applogger.warning('logging from myapp.py')
mm.myfunc()
因為我正在向根記錄器 ( ''
) 添加處理程序,所以我現在希望看到兩條消息( myapp.py
中的一條消息和myfunc
中的一條消息),但我只看到:
$ python -m myapp
logging from myapp.py
我究竟做錯了什么?
您錯過了logging.config.dictConfig()
方法禁用現有記錄器,除非您告訴它不要這樣做。 請參閱Dict Schema 詳細信息部分:
disable_existing_loggers
- 是否要禁用任何現有的非根記錄器。 此設置反映了fileConfig()
中同名的參數。 如果不存在,則此參數默認為True
。 如果 incremental 為True
,則忽略此值。
(大膽強調我的)。
您的圖書館記錄器被禁用:
(Pdb) logging.getLogger("mypackage.mymodule").disabled
False
(Pdb) n
> /.../myapp.py(16)<module>()
-> applogger = logging.getLogger(__name__)
(Pdb) logging.getLogger("mypackage.mymodule").disabled
True
明確將其設置為False
,或將incremental
設置為True
,例如:
LOGGING = {'version': 1, 'disable_existing_loggers': False}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.