可能我不太了解日志在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)
答案 0 :(得分:1)
您不能make SQLAlchemy and Flask use the same logger
,但是可以通过添加公共处理程序使它们写入一个位置。也许这篇文章会有所帮助:the documentation
顺便说一句,如果要在一个请求中获取所有日志,则可以在请求前为当前线程设置唯一名称,然后在日志记录的格式化程序中添加threadName
。
答案 1 :(得分:0)
在EDIT处回答我的问题:我仍然在create_engine上设置了“ echo = True”,所以我看到的是stderr上的所有其他输出。 echo = False停止了该操作,但仍记录到调试级别DEBUG。