在Python的日志包中记录了logging.config.fileConfig的意外输出

时间:2013-10-19 12:53:37

标签: python logging

我打算将代码中的日志记录配置提取到logging.conf文件中。 但这种行为似乎彼此不同。

目前简单的硬编码案例是:

import sys
import logging
import logging.handlers

# loggers
root = logging.getLogger()
mylogger = logging.getLogger("mylogger")

# handler
consoleHandler = logging.StreamHandler(sys.stderr)

# formatter
simpleFormatter = logging.Formatter(
    "%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# config
consoleHandler.setLevel(logging.INFO)
consoleHandler.setFormatter(simpleFormatter)
root.setLevel(logging.INFO)
root.addHandler(consoleHandler)

if __name__ == '__main__':
    mylogger.debug("mylogger debug")
    mylogger.info("mylogger info")
    mylogger.warning("mylogger warning")
    mylogger.error("mylogger error")

    root.debug("root debug")
    root.info("root info")
    root.warning("root warning")
    root.error("root error")

使用logging.conf的(可能)可比较配置是:

import logging
import logging.config

# loggers
root = logging.getLogger()
mylogger = logging.getLogger("mylogger")


if __name__ == '__main__':
    # load configuration from a file
    logging.config.fileConfig("logging.conf")

    mylogger.debug("mylogger debug")
    mylogger.info("mylogger info")
    mylogger.warning("mylogger warning")
    mylogger.error("mylogger error")

    root.debug("root debug")
    root.info("root info")
    root.warning("root warning")
    root.error("root error")

logging.conf是:

[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter


[logger_root]
level=INFO
handlers=consoleHandler

[handler_consoleHandler]
class=StreamHandler
args=(sys.stderr,)
level=INFO
formatter=simpleFormatter

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

前者的输出包括来自mylogger的日志:

2013-10-19 21:36:05,866 - mylogger - INFO - mylogger info
2013-10-19 21:36:05,866 - mylogger - WARNING - mylogger warning
2013-10-19 21:36:05,866 - mylogger - ERROR - mylogger error
2013-10-19 21:36:05,866 - root - INFO - root info
2013-10-19 21:36:05,866 - root - WARNING - root warning
2013-10-19 21:36:05,866 - root - ERROR - root error

,但后者之一不包括来自mylogger的日志:

2013-10-19 21:38:39,753 - root - INFO - root info
2013-10-19 21:38:39,753 - root - WARNING - root warning
2013-10-19 21:38:39,753 - root - ERROR - root error

在我的真实项目中,记录器对象出现在logger = logging.getLogger (__name__)的许多文件中,因此很难列出logging.conf中除“root”记录器之外的所有记录器。

有没有一种很好的方法来修复后一个例子以获得前一种情况的相同输出?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Python 2.6或更高版本,则应使用其他关键字参数logging.config.fileConfig()调用disable_existing_loggers=False(默认值为True以保持向后兼容性,但没有其他原因使用该默认值。)

如果没有disable_existing_loggers=False,则禁用调用fileConfig()时的任何现有记录器,除非他们或他们的祖先在配置中命名。