如何在python中创建非根记录器

时间:2015-02-23 21:49:41

标签: python logging handler root

我正在尝试使用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!

1 个答案:

答案 0 :(得分:4)

替换

logging.basicConfig(filename='child.log')
childLogger = logging.getLogger(__name__)

在您的子模块中:

childLogger = logging.getLogger(__name__)
childLogger.addHandler(logging.FileHandler('child.log'))

或者,使用dictConfigfileConfig在一个位置配置日志记录。

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

通过这种方式,您可以在一个位置配置日志记录,这样可以更轻松地添加其他记录器,更改日志级别等。