多个模块的Python日志记录到同一个日志文件

5
我正在开发一个有多个包和主程序的Python库。我已经设置了记录器来通过配置文件记录到标准输出和日志文件中,正如这个问题在多个模块中使用Python记录器所建议的那样。当我将主程序(main.py)放入一个包(mypackage)中时,一切都按预期工作。但是,如果我在项目的根目录中启动主程序,代码就会出错(ConfigParser.NoSectionError: No section: 'formatters')。
是否有为此问题建议的解决方案?
以下是最小化的工作示例:
.
├── logging.conf
├── main.py
├── mypackage
│   ├── __init__.py
│   └── mymodule.py
└── smodels.log

logging.conf:

[loggers]
keys=root

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=consoleFormatter,fileFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

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

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=fileFormatter
args=('smodels.log',)

[formatter_consoleFormatter]
format=%(asctime)-8s.%(msecs)03d %(levelname)-8s %(name)s:%(lineno)-3s %(message)s
datefmt=%H:%M:%S

[formatter_fileFormatter]
format=%(asctime)-16s %(levelname)-8s %(filename)-s:%(lineno)-3s %(message)s
datefmt=%Y-%m-%d %H:%M

main.py:

#!/usr/bin/env python
from mypackage import mymodule
import logging
logger = logging.getLogger(__name__)

def main():
    logger.debug('This is a debug message.')
    logger.info('This is an info message.')
    mymodule.test()

if __name__=='__main__':
    main()

__init__.py:

import mymodule
import logging.config
logging.config.fileConfig('../logging.conf',disable_existing_loggers=False)
logger = logging.getLogger(__name__)

mymodule.py:

import logging
logger = logging.getLogger(__name__)

def test():
    logger.debug('Module debug.')
    logger.info('Module info.')
1个回答

4
错误提示说明无法读取 logging.conf 文件: 请按以下方式更新您的 _init_.py 文件:
 import os
 import logging.config
 # logging.config.fileConfig('../logging.conf', disable_existing_loggers=False)
 basepath = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
 logging.config.fileConfig('%s/logging.conf' % basepath)
 logger = logging.getLogger(__name__)

请告诉我这是否解决了您的问题。


谢谢,你的解决方案有效,我现在可以看到我的错误了。然而,在使用多个包时,每个包都包含这个__init__.py文件时,仍然需要将disable_existing_loggers=False选项传递给logging.config.fileConfig()函数。 - sfat
啊,请使用那个,我忘记把它加回去了。 - James Sapam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接