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