Конфигурация файла журнала 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. Я также протестировал его на Raspberry Pi с Raspbian Wheezy и Python 3.2 и в Eclipse с Python 2.7 (та же ошибка).

Кто-нибудь из вас, ребята, имеет ключ?

Ответ 1

У меня была эта проблема, потому что 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)

Ответ 2

Попробуйте заменить

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

с этим

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

Не уверен, но, вероятно, ваш logging.conf находится в вашем текущем рабочем каталоге, а с .. файл не может быть найден.

Ответ 3

d512 был верным. А при запуске кода и на основе PYTHONPATH Python рассматривает корневой каталог вашего проекта как "текущий путь", независимо от того, где находится исполняемый файл. Таким образом, можно добавить относительный путь следующим образом:

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

или относительно текущего файла:

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

Надеюсь, это поможет

Ответ 4

В моем случае logging.config присутствует в каталоге grandparent и создает проблему, даже если указан правильный путь в logging.config.fileconfig(). Любая помощь?