【问题标题】:Python logging file config KeyError: 'formatters'Python 日志文件配置 KeyError: 'formatters'
【发布时间】:2014-06-03 09:55:07
【问题描述】:

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

你们中有人知道吗?

【问题讨论】:

  • 错误提示它正在寻找一个不同的文件logging.config.fileConfig('../logging.ini', disable_existing_loggers=False) 它正在寻找一个以.ini 结尾的文件,而您的代码以.conf 结尾?
  • 错字,对不起...我刚刚安装了 PyCharm 并在那里使用相同的 Python 3.3.5 安装对其进行了测试。并且:它有效!有什么想法吗?
  • 嗨,莫里茨,您解决了这个问题吗?我目前在尝试通过登录 RPi 来运行我的应用程序时遇到了同样的问题。

标签: python eclipse logging keyerror


【解决方案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)

【讨论】:

  • 还要检查以确保您的日志记录配置文件确实存在于您认为的位置。
  • 是的,错误信息没用。感谢@d512 和@hughes - 我的清单文件中缺少的是include path/to/logging.ini,因此该文件未包含在我的轮子包中!它在我的本地机器上工作,但在部署到 AWS Lambda 后立即死亡!
  • 谢谢,就是这样。对您的回复投了赞成票:)。我能够指定一个相对路径并且它有效。仅适用于使用带有 Microsoft 的 Python 扩展的 VS Code 的人:无论您的类或脚本在哪里,默认的当前工作目录都是您工作区的顶级文件夹。
  • 这很漂亮,无论我尝试什么都找不到正确的路径。这就像一个魅力。
【解决方案2】:

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

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

或相对于当前文件:

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

希望对你有帮助

【讨论】:

    【解决方案3】:

    尝试替换

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

    有了这个

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

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

    【讨论】:

    • 嗨,不,这不是问题所在。路径是正确的,当我改变它时,我得到一个错误,它是错误的路径。还是谢谢你。
    【解决方案4】:

    就我而言,我的 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。

    【讨论】:

      【解决方案5】:

      我的一些日志记录设置位于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
      

      【讨论】:

        【解决方案6】:

        在我的情况下,当我尝试在 Docker 容器上运行烧瓶应用程序时出现此错误。

        帮助我的是添加:

        flask db init
        

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

        【讨论】:

          猜你喜欢
          • 2019-05-01
          • 1970-01-01
          • 2011-05-15
          • 2016-10-24
          • 2020-08-11
          • 1970-01-01
          • 1970-01-01
          • 2016-06-30
          • 2014-06-11
          相关资源
          最近更新 更多