如何在 python 中创建 non-root 记录器
How to create a non-root logger in python
我正在尝试使用 logging.getLogger('child') 在 child python 模块中创建一个 non-root 记录器,但我得到了错误 "No handlers could be found for logger "child"
我正在尝试让 parent 模块记录到 parent 日志文件。 parent 模块将创建 child 模块的实例,我希望 child 模块编写自己的 child 日志文件,而不会将其消息传播到 parent 日志文件。
这是我对 parent 模块(由用户执行)的内容:
#!/usr/bin/env python
import logging, child
logging.basicConfig( filename='parent.log' )
logging.warning( 'test log from parent' )
c = child.run()
这里是 child 模块:
import logging
class run:
def __init__(self):
logging.basicConfig( filename = 'child.log' )
childLogger = logging.getLogger( __name__ )
childLogger.propagate = False
childLogger.warning( 'this is a log from the child' )
预期输出有 2 个文件:parent.log(包含来自 parent 模块的 1 行警告)和 child.log(包含来自 [=37 的警告行) =]模块)。
实际输出是:一个警告行(来自parent)被打印到parent.log文件中,并且没有child.log文件——child日志消息未记录在任何地方。
你能告诉我我错过了什么吗? TIA!
替换
logging.basicConfig(filename='child.log')
childLogger = logging.getLogger(__name__)
在您的子模块中:
childLogger = logging.getLogger(__name__)
childLogger.addHandler(logging.FileHandler('child.log'))
或者,或者,使用 dictConfig or fileConfig 在一处配置日志记录。
basicConfig 怎么了?来自文档:
This function does nothing if the root logger already has handlers configured for it.
所以基本上,您在子模块中对 basicLogging
的调用没有任何效果,因为第一个(在父模块中)已经配置了根记录器。通过将子记录器的 propagate
设置为 false
,子记录器的日志条目不会转发到根记录器,因此您会收到 No handlers could be found...
警告。
编辑
只是详细说明 fileConfig,它允许很大的灵活性,您可以为您的模块创建一个名为 logging.ini
:
的文件
[loggers]
keys=root,child
[handlers]
keys=logfile,logfile_child
[formatters]
keys=default
# loggers
[logger_root]
level=INFO
handlers=logfile
[logger_child]
level=INFO
handlers=logfile_child
qualname=child
propagate=0
# handlers
[handler_logfile]
class=FileHandler
formatter=default
args=('parent.log',)
[handler_logfile_child]
class=FileHandler
formatter=default
args=('child.log',)
# formatters
[formatter_default]
format=%(asctime)s [%(module)s:%(lineno)d] %(levelname)s %(message)s
datefmt=
然后,在您的应用程序的某处,您只需要调用 fileConfig
:
import logging.config
logging.config.fileConfig('logging.ini')
通过这种方式,您的日志记录在一个地方进行配置,这使得添加额外的记录器、更改日志级别等变得更加容易。
我正在尝试使用 logging.getLogger('child') 在 child python 模块中创建一个 non-root 记录器,但我得到了错误 "No handlers could be found for logger "child"
我正在尝试让 parent 模块记录到 parent 日志文件。 parent 模块将创建 child 模块的实例,我希望 child 模块编写自己的 child 日志文件,而不会将其消息传播到 parent 日志文件。
这是我对 parent 模块(由用户执行)的内容:
#!/usr/bin/env python
import logging, child
logging.basicConfig( filename='parent.log' )
logging.warning( 'test log from parent' )
c = child.run()
这里是 child 模块:
import logging
class run:
def __init__(self):
logging.basicConfig( filename = 'child.log' )
childLogger = logging.getLogger( __name__ )
childLogger.propagate = False
childLogger.warning( 'this is a log from the child' )
预期输出有 2 个文件:parent.log(包含来自 parent 模块的 1 行警告)和 child.log(包含来自 [=37 的警告行) =]模块)。
实际输出是:一个警告行(来自parent)被打印到parent.log文件中,并且没有child.log文件——child日志消息未记录在任何地方。
你能告诉我我错过了什么吗? TIA!
替换
logging.basicConfig(filename='child.log')
childLogger = logging.getLogger(__name__)
在您的子模块中:
childLogger = logging.getLogger(__name__)
childLogger.addHandler(logging.FileHandler('child.log'))
或者,或者,使用 dictConfig or fileConfig 在一处配置日志记录。
basicConfig 怎么了?来自文档:
This function does nothing if the root logger already has handlers configured for it.
所以基本上,您在子模块中对 basicLogging
的调用没有任何效果,因为第一个(在父模块中)已经配置了根记录器。通过将子记录器的 propagate
设置为 false
,子记录器的日志条目不会转发到根记录器,因此您会收到 No handlers could be found...
警告。
编辑
只是详细说明 fileConfig,它允许很大的灵活性,您可以为您的模块创建一个名为 logging.ini
:
[loggers]
keys=root,child
[handlers]
keys=logfile,logfile_child
[formatters]
keys=default
# loggers
[logger_root]
level=INFO
handlers=logfile
[logger_child]
level=INFO
handlers=logfile_child
qualname=child
propagate=0
# handlers
[handler_logfile]
class=FileHandler
formatter=default
args=('parent.log',)
[handler_logfile_child]
class=FileHandler
formatter=default
args=('child.log',)
# formatters
[formatter_default]
format=%(asctime)s [%(module)s:%(lineno)d] %(levelname)s %(message)s
datefmt=
然后,在您的应用程序的某处,您只需要调用 fileConfig
:
import logging.config
logging.config.fileConfig('logging.ini')
通过这种方式,您的日志记录在一个地方进行配置,这使得添加额外的记录器、更改日志级别等变得更加容易。