Python 日志文件配置 KeyError: 'formatters
我现在在做一个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 个回答
我的一些日志设置是在 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
试着把
logging.config.fileConfig('../logging.conf', disable_existing_loggers=False)
换成这个
logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
不太确定,但可能是你的 logging.conf
文件在你当前的工作目录里,而用 ..
的话就找不到这个文件了。
在我的情况下,我的 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 哦。
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)
希望这对你有帮助。
我遇到了一个问题,因为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)