您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python记录多个模块记录器不在主程序外工作

5b51 2022/1/14 8:22:34 python 字数 5404 阅读 535 来源 www.jb51.cc/python

我的目标是从多个模块进行日志记录,而只在一个地方配置记录器 – 在主程序中.如 this answer所示,应该包括 logging.config.fileConfig('/path/to/logging.conf') 在主程序中,然后在所有其他模块中包括 logger = logging.getLogger(__name__) 我相信这就是我在下面所做的,但我得到了意想不到的行为. c.py #

概述

logging.config.fileConfig('/path/to/logging.conf')

在主程序中,然后在所有其他模块中包括

logger = logging.getLogger(__name__)

我相信这就是我在下面所做的,但我得到了意想不到的行为.

c.py

# c.py
import logging
import logging.config
import d

logging.config.fileConfig("logging.conf")
logger = logging.getLogger(__name__)

logger.warning('logging from c')
d.foo()

d.py

# d.py
import logging

logger = logging.getLogger(__name__)

# this will print when d is imported
logger.warning('logging from d on import')

def foo():
    # this does not print
    logger.warning("logging from d on call foo()")

产量

$python c.py
logging from d on import
logging from c

我除了之外,是当d.foo()在c.py中执行时,将从d记录消息,但事实并非如此.这很令人困惑,因为当从d中的模块级别调用记录器时,它会将一条消息记录到控制台,但是当从foo()内部调用时它不会.

配置文件

[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(message)s
datefmt=

更深入的分析

所以我注意到,如果我删除该行

logging.config.fileConfig("logging.conf")

从c.py开始,然后从d.foo()进行日志记录按预期工作.所以在配置文件中有一些错误,或者由于我提供的配置文件导致d.py中的记录器搞砸了.

>为什么从模块级别调用时会从d记录消息,而不是从d.foo()内部调用
>如何才能实现从多个模块进行日志记录的目标,同时仅在主程序中配置日志记录?

import d

来之前

logging.config.fileConfig("logging.conf")

正如@davidejones所指出的那样.原因如下:

docs中所述,当调用logging.config.fileConfig()时,其认行为是禁用任何现有记录器.因此,当导入d发生时,logger在d中初始化,然后当调用logging.config.fileConfig()时,d中的记录器被禁用,这就是为什么我们在调用d.foo()时没有看到任何记录.

logging.config.fileConfig()接受一个参数disable_existing_loggers,认为True.使用

logging.config.fileConfig("logging.conf",disable_existing_loggers=False)

输出变成了

>>> python c.py
logging from d on import
logging from c
logging from d on call foo()

正如所料.

总结

以上是编程之家为你收集整理的Python记录多个模块记录器不在主程序外工作全部内容,希望文章能够帮你解决Python记录多个模块记录器不在主程序外工作所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶