我的目标是从多个模块进行日志记录,同时只在一个地方配置记录器--在主程序中。如本答案所示,应包括
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
中的记录器出错。
D
记录消息,而不是从d.foo()
内部记录消息?问题在于
import d
出现在前面
logging.config.fileConfig("logging.conf")
正如@DavideJones所指出的。原因如下:
正如文档中所述,当调用logging.config.fileConfig()
时,其默认行为是禁用任何现有的记录器。因此,当导入D
发生时,Logger
在D
中初始化,然后当调用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请求?