gpt4 book ai didi

python - 如何在 python 中创建一个非 root 记录器

转载 作者:太空狗 更新时间:2023-10-30 03:00:34 25 4
gpt4 key购买 nike

我正在尝试使用 logging.getLogger('child') 在子 python 模块中创建一个非根记录器,但我收到错误“找不到记录器“子”的处理程序”

我正在尝试让父模块记录到父日志文件。父模块将创建子模块的实例,我希望子模块编写自己的子日志文件,而不将其消息传播到父日志文件。

这是父模块的内容(由用户执行):

#!/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 行警告)和 child.log(包含来自子模块的第 1 行警告)。

实际输出是:一个 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 有什么问题? ?来自文档:

This function does nothing if the root logger already has handlers configured for it.

所以基本上,您在子模块中调用 basicLogging 没有任何效果,因为第一个(在父模块中)已经配置了根记录器。通过将子记录器的 propagate 设置为 false,子记录器的日志条目不会转发到根记录器,因此您会得到 No handlers could be found ... 警告。

编辑

只是详细说明 fileConfig ,这允许很大的灵 active ,您可以为您的模块创建一个名为 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')

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

关于python - 如何在 python 中创建一个非 root 记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com