如何使SQLAlchemy和Flask使用相同的记录器?

时间:2018-12-18 12:07:47

标签: python flask sqlalchemy

可能我不太了解日志在Python中的实际工作方式。我正在尝试调试Flask + SQLAlchemy(但没有flask_sqlalchemy)应用程序,该应用程序仅在从Apache内部运行时才神秘地挂在某些查询上,因此我需要进行适当的日志记录才能获取有意义的信息。默认情况下,Flask应用程序带有一个不错的logger +处理程序,但是如何使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)

2 个答案:

答案 0 :(得分:1)

您不能make SQLAlchemy and Flask use the same logger,但是可以通过添加公共处理程序使它们写入一个位置。也许这篇文章会有所帮助:the documentation

顺便说一句,如果要在一个请求中获取所有日志,则可以在请求前为当前线程设置唯一名称,然后在日志记录的格式化程序中添加threadName

答案 1 :(得分:0)

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