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

Python: How to properly configure logging for a library with dictConfig?

我有一个结构如下的项目文件夹:

.
├── myapp.py
└── mypackage
    ├── __init__.py
    └── mymodule.py

现在我想按照文档 (Configuring Logging for a Library) 中的描述为 mypackage 配置日志记录,所以我在我的 [=18= 中的顶级记录器中添加了一个 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()

因为我正在向 root-logger ('') 添加处理程序,所以我现在希望看到两条消息(myapp.py 中的一条和 myfunc 中的一条)但是我只看到:

$ python -m myapp
logging from myapp.py

我做错了什么?

你错过了 logging.config.dictConfig() method disables existing loggers, unless you tell it not to. See the Dict Schema Details section:

disable_existing_loggers - whether any existing non-root loggers are to be disabled. This setting mirrors the parameter of the same name in fileConfig(). If absent, this parameter defaults to True. This value is ignored if incremental is 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}