Flask WSGI日志记录在Apache2上的日志错误

时间:2015-10-16 18:34:08

标签: python apache logging flask wsgi

这是我的apache error.log的一个例子:

[Fri Oct 16 18:28:24.816206 2015] [:info] [pid 13739:tid 139772762691456] mod_wsgi (pid=13739): Attach interpreter ''.
[Fri Oct 16 18:28:41.608894 2015] [:info] [pid 13739:tid 139772651718400] [remote 10.1.10.37:56161] mod_wsgi (pid=13739, process='dsapp', application=''): Loading WSGI script '/var/www/blackbird/blackbird.wsgi'.
[Fri Oct 16 18:28:42.176915 2015] [:info] [pid 13740:tid 139772651718400] [remote 10.1.10.154:49761] mod_wsgi (pid=13740, process='app2', application=''): Loading WSGI script '/var/www/whiteboard_v2/whiteboard.wsgi'.
[Fri Oct 16 18:28:45.863991 2015] [:error] [pid 13740:tid 139772467078912] INFO:app.api.routes:API/search: ImmutableMultiDict([('m', 'n'), ('q', '')])

注意最后一个日志条目[:error]。

我想在apache2上登录相应的级别。我希望最后一个条目说[:info]而不是[:error]。

我的Flask-WSGI配置如下:

from flask import redirect, url_for, jsonify, request, send_file, current_app
from . import api
from flask.ext.cors import cross_origin
from ..models import Inventory
from app import db
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@api.route('/api/search', methods=['GET'])
@cross_origin()
def index():
    d=request.args['q']
    m=request.args['m']
    logger.info('API/search: %s', request.args)

你可以清楚地看到我的意图是'信息'。如何配置Apache以登录approrpiate级别,以便我的烧瓶logger.info读取[:info]而不是[:error]?

2 个答案:

答案 0 :(得分:1)

Python日志记录级别与Apache日志记录级别无关。显然,Apache处理来自应用程序mod_wsgi的输出正在以error级别运行。让您的Web服务器记录与Web服务器相关的事情。配置Python以将您的应用程序日志发送到其他文件。

logging.basicConfig(filename='/path/to/app.log', level=logging.INFO)

答案 1 :(得分:1)

当使用stdout / stderr确保通常输出任何消息时,在Apache级别使用错误日志级别。如果没有这样做并且您尝试使用Python级别日志级别来尝试启用调试,那么如果它在调试级别传递给Apache,您将永远不会在Apache日志中看到它。这是因为Apache日志级别会覆盖并抑制它。你不希望设置Apache日志级别来允许它,因为它会从你真正不想要的Apache模块中产生大量的噪音。

因此,请忽略Apache说这是一个错误级别的事实,并且很高兴它仍然实际上已被记录。在面对两个日志级别设置时,它确实是最好的折衷方案,一个在Apache中,一个在Python中。

总的来说,我建议不要按照其他人的建议配置Python日志记录以使用不同的文件,除非您确保使用的日志处理程序正确处理来自多个进程的写入并正确地记录日志。 Apache处理这些都很好,但Python标准记录器没有。