[英]How to create a non-root logger in python
我正在尝试使用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!
更换
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
,子项的日志条目不会被转发到根记录器,因此您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')
这样您的日志记录就可以在一个地方配置,这样可以更容易地添加其他记录器,更改日志级别等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.