Python日志文件配置KeyError:'formatters'

mor*_*upp 22 python eclipse logging keyerror

我目前正在开发一个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'
Run Code Online (Sandbox Code Playgroud)

这是我的日志文件:

[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=
Run Code Online (Sandbox Code Playgroud)

以及相关代码:

if __name__ == '__main__':

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

    obc = Onboard_computer('/dev/ttys001')
    obc.run()
Run Code Online (Sandbox Code Playgroud)

它与Python Logging Tutorial几乎相同.我真的不明白为什么它不起作用而且它变得疯狂.它工作,我没有改变代码和设置,它只是停止工作,Python抛出这个KeyError.

我的设置:Mac OS X 10.9.2,带有PyDev和Python 3.3的Eclipse Kepler.我还在Raspberry Pi上使用Raspbian Wheezy和Python 3.2以及在Eclipse中使用Python 2.7(相同的错误)进行了测试.

你们中的任何人都有线索吗?

最好的,莫里茨

d51*_*512 34

我有这个问题,因为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)
Run Code Online (Sandbox Code Playgroud)

  • 还要检查以确保您的日志记录配置文件确实存在,您认为它确实存在。 (2认同)

小智 6

d512 是正确的。当运行代码并基于 PYTHONPATH 时,无论运行文件位于何处,Python 都会将项目根目录视为“当前路径”。因此,另一种方法是添加相对路径,如下所示:

import logging
logging.config.fileConfig('root_path_of_project/.../logging.conf')
Run Code Online (Sandbox Code Playgroud)

或相对于当前文件:

LOGGING_CONFIG = Path(__file__).parent / 'logging.conf'
...
logging.config.fileConfig(LOGGING_CONFIG)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你


小智 5

就我而言,我的logging.conf文件中缺少以下内容 -

[formatters]
keys = json
Run Code Online (Sandbox Code Playgroud)

以下是整个文件的结构 -

[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
Run Code Online (Sandbox Code Playgroud)

使用记录器的 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>"}

Run Code Online (Sandbox Code Playgroud)

顺便说一句,不要忘记安装 python-json-logger。


Jos*_*uis 2

尝试更换

logging.config.fileConfig('../logging.conf', disable_existing_loggers=False)
Run Code Online (Sandbox Code Playgroud)

有了这个

logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
Run Code Online (Sandbox Code Playgroud)

不确定,但可能您logging.conf位于当前工作目录中,并且..无法找到该文件。