如何在 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')

通过这种方式,您的日志记录在一个地方进行配置,这使得添加额外的记录器、更改日志级别等变得更加容易。