繁体   English   中英

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

[英]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'))

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM