【问题标题】:How to make SQLAlchemy and Flask use the same logger?如何使 SQLAlchemy 和 Flask 使用相同的记录器?
【发布时间】:2018-12-18 12:07:47
【问题描述】:

可能我不太了解日志记录在 Python 中的实际工作原理。我正在尝试调试一个 Flask+SQLAlchemy(但没有 flask_sqlalchemy)应用程序,该应用程序只有在从 Apache 中运行时才会神秘地挂在某些查询上,所以我需要有适当的日志记录才能获得有意义的信息。 Flask 应用程序默认带有一个不错的记录器+处理程序,但我如何让 SQLAlchemy 使用相同的记录器?

SQLAlchemy 中的“配置日志记录”部分仅说明了如何打开一般的日志记录,而不是如何将 SQLAlchemy 的日志记录输出“连接”到现有的记录器。

我一直在看着Flask + sqlalchemy advanced logging 有一段时间,一脸茫然,没有表情。我不知道我的问题的答案是否在那里。

编辑:感谢给出的答案,我现在知道我可以让两个记录器使用同一个处理程序。当然,现在我的 apache 错误日志中充斥着数百行回显的 SQL 调用。我只想将错误消息记录到 httpd 日志中,并将所有较低级别的内容转移到单独的日志文件中。请参阅下面的代码。但是,我仍然将每条调试消息都放入 http 日志中。为什么?

if app.config['DEBUG']:
    # Make logger accept all log levels
    app.logger.setLevel(logging.DEBUG)
    for h in app.logger.handlers:
        # restrict logging to /var/log/httpd/error_log to errors only
        h.setLevel(logging.ERROR)
    if app.config['LOGFILE']:
        # configure debug logging only if logfile is set
        debug_handler = logging.FileHandler(app.config['LOGFILE'])
        debug_handler.setLevel(logging.DEBUG)
        app.logger.addHandler(debug_handler)
        # get logger for SQLAlchemy
        sq_log = logging.getLogger('sqlalchemy.engine')
        sq_log.setLevel(logging.DEBUG)
        # remove any preconfigured handlers there might be
        for h in sq_log.handlers:
            sq_log.removeHandler(h)
            h.close()
        # Now, SQLAlchemy should not have any handlers at all. Let's add one
        # for the logfile
        sq_log.addHandler(debug_handler)

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    你不能make SQLAlchemy and Flask use the same logger,但你可以通过添加一个通用的处理程序让他们写到一个地方。也许这篇文章有帮助:https://www.electricmonk.nl/log/2017/08/06/understanding-pythons-logging-module/

    顺便说一句,如果你想在一个请求中获取所有日志,你可以在请求之前为当前线程设置一个 uniq 名称,并在你的日志格式化程序中添加threadName

    【讨论】:

      【解决方案2】:

      在 EDIT 中回答我的问题:我仍然在 create_engine 上设置了“echo=True”,所以我看到的是 stderr 上的所有附加输出。 echo=False 会停止该操作,但仍会记录到调试级别 DEBUG。

      【讨论】:

        【解决方案3】:

        清除所有由 SqlAlchemy 创建的相应处理程序:

        logging.getLogger("sqlalchemy.engine.Engine").handlers.clear()
        

        上面的代码应该在引擎创建后调用。

        【讨论】:

          猜你喜欢
          • 2018-07-13
          • 1970-01-01
          • 2021-01-26
          • 1970-01-01
          • 2016-05-11
          • 1970-01-01
          • 2019-07-13
          • 2021-07-02
          • 1970-01-01
          相关资源
          最近更新 更多