Python 日志文件配置 KeyError: 'formatters

68 投票
7 回答
72622 浏览
提问于 2025-04-18 03:19

我现在在做一个Python项目,已经通过配置文件设置了日志记录。之前一切正常,日志也按我想要的方式记录了信息。

但是,后来我调整了一些包和模块的位置后,结果只出现了一个键错误。

完整的错误追踪信息:

    Traceback (most recent call last):
  File "/Volumes/Daten/Eclipse/workspace/Carputer/src/pyboard/__init__.py", line 42, in <module>
    logging.config.fileConfig('../logging.conf', disable_existing_loggers=False)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/logging/config.py", line 70, in fileConfig
    formatters = _create_formatters(cp)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/logging/config.py", line 103, in _create_formatters
    flist = cp["formatters"]["keys"]
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/configparser.py", line 937, in __getitem__
    raise KeyError(key)
KeyError: 'formatters'

这是我的日志文件:

[loggers]
keys=root,pyBoard

[handlers]
keys=consoleHandler

[formatters]
keys=detailedFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_pyBoard]
level=DEBUG
handlers=consoleHandler
qualname=pyBoard
propagate=0

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

[formatter_detailedFormatter]
format=%(asctime)s - %(name)s - %(levelname)s : Line %(lineno)s - %(message)s
datefmt=

还有相关的代码:

if __name__ == '__main__':

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

    obc = Onboard_computer('/dev/ttys001')
    obc.run()

这几乎和Python日志教程中的内容一模一样。我真的搞不懂为什么它不工作,这让我很烦。之前是可以的,我没有改动代码或设置,但它就是突然不工作了,Python抛出了这个KeyError。

我的环境是:Mac OS X 10.9.2,使用Eclipse Kepler和PyDev,以及Python 3.3。我还在一台装有Raspbian Wheezy和Python 3.2的树莓派上测试过,也在Eclipse中用Python 2.7测试过(同样的错误)。

你们有没有人知道怎么回事?

7 个回答

0

我的一些日志设置是在 migrations/alembic.ini 这个文件里的。

# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic

我觉得不想去改这个文件,所以我直接删除了迁移文件夹,删除了数据库里的 alembic_version 表,然后运行了 flask db stamp heads,这样我就可以正常进行添加列的数据库操作了。

# flask db init         # only needed when you don't have any db setup
flask db stamp head
flask db migrate
flask db upgrade
2

试着把

logging.config.fileConfig('../logging.conf', disable_existing_loggers=False)

换成这个

logging.config.fileConfig('logging.conf', disable_existing_loggers=False)

不太确定,但可能是你的 logging.conf 文件在你当前的工作目录里,而用 .. 的话就找不到这个文件了。

5

在我的情况下,我的 logging.conf 文件里缺少了以下内容 -

[formatters]
keys = json

下面是整个文件的结构 -

[loggers]
keys = root,__main__

[logger_root]
handlers =

[logger___main__]
level = INFO
handlers = __main__
qualname = __main__

[handlers]
keys = __main__

[handler___main__]
class = StreamHandler
level = INFO
formatter = json
args = (sys.stdout,)

[formatters]
keys = json

[formatter_json]
format=%(asctime)f %(module)s %(levelname)s %(message)s %(funcName)s
class = pythonjsonlogger.jsonlogger.JsonFormatter

这是一个使用日志记录器的 Python 文件 -

import logging.config
from os import path

log_file_path = path.join(path.dirname(path.abspath('logging.conf')), 'logging.conf')

logging.config.fileConfig(log_file_path, disable_existing_loggers=False)
logger = logging.getLogger(__name__)

logger.info('random message')  
#{"asctime": "2021-10-22 02:48:26,532", "module": "jsonLogger", "levelname": "INFO", "message": "random message", "funcName": "<module>"}

顺便提一下,别忘了安装 python-json-logger 哦。

6

d512说得对。运行代码时,Python会根据你的PYTHONPATH,把你的项目根目录当作“当前路径”,无论你的运行文件在哪里。所以,另一种方法是添加相对路径,可以像下面这样:

import logging
logging.config.fileConfig('root_path_of_project/.../logging.conf')

或者可以相对于当前文件添加路径:

LOGGING_CONFIG = Path(__file__).parent / 'logging.conf'
...
logging.config.fileConfig(LOGGING_CONFIG)

希望这对你有帮助。

117

我遇到了一个问题,因为Python找不到我的配置文件,虽然错误信息并没有告诉我这一点。显然,Python并不是根据运行代码的文件来查找配置文件,而是根据当前的工作目录来查找(你可以通过os.getcwd()来获取这个目录)。我使用了以下代码来初始化日志记录器。log.config文件和运行这段代码的文件在同一个目录下:

from os import path
log_file_path = path.join(path.dirname(path.abspath(__file__)), 'log.config')
logging.config.fileConfig(log_file_path)

撰写回答