我正在尝试使用logging.getLogger('child')在子python模块中创建一个非root记录器,但是我收到一条错误“找不到logler”child“的处理程序
我正在尝试将父模块日志记录到父日志文件中。父模块将创建子模块的实例,我希望子模块编写自己的子日志文件,而不将其消息传播到父日志文件。
这是我对父模块的看法(由用户执行):
#!/usr/bin/env python
import logging, child
logging.basicConfig( filename='parent.log' )
logging.warning( 'test log from parent' )
c = child.run()
这是儿童模块:
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(包含父模块中的1 WARNING行)和child.log(包含子模块中的一个WARNING行)。
实际输出是:一个WARNING行(来自父级)打印到parent.log文件中,并且没有child.log文件 - 子日志消息不会记录在任何地方。
你可以告诉我我错过了什么吗? TIA!答案 0 :(得分:4)
替换
logging.basicConfig(filename='child.log')
childLogger = logging.getLogger(__name__)
在您的子模块中:
childLogger = logging.getLogger(__name__)
childLogger.addHandler(logging.FileHandler('child.log'))
或者,使用dictConfig或fileConfig在一个位置配置日志记录。
basicConfig有什么问题?来自文档:
如果根记录器已经为其配置了处理程序,则此函数不执行任何操作。
基本上,您对子模块中basicLogging
的调用无效,因为第一个(在父模块中)已经配置了根记录器。通过将子记录器的propagate
设置为false
,子项的日志条目不会转发到根记录器,因此您可以获得{{1}警告。
修改强>
为了详细说明fileConfig,它为您的模块提供了很大的灵活性,您可以创建一个名为No handlers could be found...
的文件:
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
通过这种方式,您可以在一个位置配置日志记录,这样可以更轻松地添加其他记录器,更改日志级别等。