web-dev-qa-db-ja.com

Python logging file config 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 Logging Tutorial の場合とほぼ同じです。なぜそれが機能しないのかわからず、それが狂ってしまいます。動作しました。コードもセットアップも何も変更しませんでした。動作が停止し、PythonがこのKeyErrorをスローしました。

私のセットアップ:Mac OS X 10.9.2、PyDevを使用したEclipse KeplerおよびPython3.3。RaspbianWheezyおよびPython 3.2を使用したRaspberry Piでもテストしました。 EclipseではPython 2.7(同じエラー))。

誰か手がかりはありますか?

26
moritzrupp

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)
31
d512

交換してみてください

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

これとともに

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

確かではありませんが、おそらくあなたのlogging.confは現在の作業ディレクトリにあり、..ファイルが見つかりません。

2
José Luis

d512は正しかった。コードを実行し、PYTHONPATHに基づいている場合、Pythonは、実行中のファイルがどこにあっても、プロジェクトのルートディレクトリを「現在のパス」として扱います。別の方法は、相対パスを追加することです次のいずれか:

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

または現在のファイルを基準にして:

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

それが役に立てば幸い

0
Steven Chen