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

Flask WSGI logging logs at the wrong level on Apache2

这是我的 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)

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

Python 日志级别与 Apache 日志级别无关。显然,Apache 将应用 mod_wsgi is 运行 的输出视为 error 级别。让你的网络服务器记录网络服务器相关的东西。配置 Python 以将您的应用日志发送到其他文件。

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

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

因此,请忽略 Apache 表示这是一个错误级别这一事实,并为它实际上仍在记录而感到高兴。面对有两个日志级别设置,一个在 Apache 中,一个在 Python.

中,这确实是最好的折衷方案

总的来说,我建议不要像其他人建议的那样配置 Python 日志记录以使用不同的文件,除非您确保使用的日志记录处理程序能够正确处理来自多个进程的写入并正确地轮换日志。 Apache 可以很好地处理这两个问题,但 Python 标准记录器不会。