48

我目前正在开发一个 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 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 进行了测试(同样的错误)。

有没有人有线索?

4

6 回答 6

85

我遇到了这个问题,因为 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)
于 2016-07-30T23:27:06.063 回答
5

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

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

或相对于当前文件:

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

希望能帮助到你

于 2018-09-02T08:41:47.723 回答
2

尝试更换

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

有了这个

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

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

于 2014-04-29T15:20:09.733 回答
1

就我而言,我的 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 顺便说一句。

于 2021-10-22T09:57:40.983 回答
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
于 2021-07-07T04:35:58.203 回答
-1

就我而言,当我尝试在 Docker 容器上运行烧瓶应用程序时出现此错误。

帮助我的是添加:

flask db init

进入在容器创建开始时运行的 boot.sh。

于 2020-11-08T15:58:58.230 回答