当前位置: 首页 > 知识库问答 >
问题:

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

宰父德馨
2023-03-14

我的目标是从多个模块进行日志记录,同时只在一个地方配置记录器--在主程序中。如本答案所示,应包括

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

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

logger = logging.getLogger(__name__)

我相信这就是我在下面所做的,然而我却得到了意想不到的行为。

# 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
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中的记录器出错。

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

共有1个答案

靳越
2023-03-14

问题在于

import d

出现在前面

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

正如@DavideJones所指出的。原因如下:

正如文档中所述,当调用logging.config.fileConfig()时,其默认行为是禁用任何现有的记录器。因此,当导入D发生时,LoggerD中初始化,然后当调用logging.config.fileConfig()时,D中的Logger被禁用,这就是为什么在调用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日志模块,并希望禁用由我导入的第三方模块打印的日志消息。例如,我使用的是如下所示: 当我执行logger.debug时,它会输出我的调试消息(“my Message!”),但它也会从我导入的任何模块中输出调试消息(如请求和许多其他东西)。 我只想看到我感兴趣的模块的日志消息。有没有可能让日志模块做到这一点?

  • 问题内容: 我想知道如何实现一个全局记录器,该记录器可以用自己的设置在任何地方使用: 我目前有一个自定义记录器类: 该类在一个单独的文件中,其中包含一些格式化程序和其他内容。记录器可以完美地独立运行。 我将此模块导入我的主python文件中,并创建一个像这样的对象: 但显然,我无法从代码的其他部分访问此对象。我使用错误的方法吗?有一个更好的方法吗? 问题答案: 使用创建一个名为全球记录。 main

  • 互联网上有许多帖子建议如何从logback迁移到log4j2进行Spring引导日志记录。 参考这个sof post-Spring Boot日志与log4j2-我已经配置我的项目使用log4j2。然后我添加了一些基本的log4j2.xml和log4j2.properties文件来测试。 但是在这些更改之后,我的项目无法进行任何日志记录。有人能帮我找出毛病吗? 项目代码可在github-https:

  • 我可以创建一个命名的子记录器,以便该记录器输出的所有日志都用它的名称标记。我可以只在函数/类/任何东西中使用记录器。 但是,如果该代码调用了另一个模块中的函数,该模块仅使用日志模块函数(根记录器的代理)进行日志记录,我如何确保这些日志消息通过相同的记录器(或者至少以相同的方式记录)? 例如: main.py 其他.py 产出: 我希望能够使两个日志行都标记为名称'stuff',我希望能够做到这一点

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 我正在使用python日志记录我的程序。所有日志当前都打印在stdout上,但我希望使用POST REST调用将它们发送到远程日志服务器。当前,我的程序发出了多个日志记录的POST请求。有没有更优化的方式发送日志,我可以捆绑多个日志在一个POST请求?