0

我打算将日志配置从代码中提取到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除“根”记录器之外的所有记录器。

有没有一种好方法来修复后一个示例以获得与前一个案例相同的输出?

谢谢。

4

1 回答 1

0

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

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

于 2013-10-19T16:30:02.867 回答