繁体   English   中英

Python:如何使用 dictConfig 为库正确配置日志记录?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM