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}
我有一个结构如下的项目文件夹:
.
├── 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 infileConfig()
. If absent, this parameter defaults toTrue
. This value is ignored if incremental isTrue
.
(大胆强调我的)。
您的图书馆记录器已被禁用:
(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}