如何更改Flask日志/调试屏幕的输出格式? - python

我需要更改默认的Flask / Werkzeug调试输出。

我已经试过了:

app = Flask(__name__)
app.config["TESTING"] = True
...
log = logging.getLogger("werkzeug")
log.disabled = True

那行得通。输出完全被抑制,不再显示以下行:

111.222.81.83 - - [26/Mar/2019 13:31:04] "POST /catchdata HTTP/1.1" 200 -
112.122.81.83 - - [26/Mar/2019 13:31:07] "POST /catchdata HTTP/1.1" 200 -

哪个好!

然后,我加入了以下代码行:

@app.route("/catchdata", methods=["POST"])
def catchdata():
    app.logger.info("In Catch")
    ...

这就是我所拥有的:

--------------------------------------------------------------------------------
INFO in __init__ [/srv/www/wsgi/Flask/service_py3/app/srv/__init__.py:438]:
In Catch
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
INFO in __init__ [/srv/www/wsgi/Flask/service_py3/app/srv/__init__.py:438]:
In Catch
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
INFO in __init__ [/srv/www/wsgi/Flask/service_py3/app/srv/__init__.py:438]:
In Catch
--------------------------------------------------------------------------------

如何将默认格式更改为仅获取:

In Catch
In Catch
In Catch

我不需要登录到文件。仅屏幕。
谢谢!

参考方案

Flask使用具有默认配置的标准Python日志记录对象,该对象由带有简单Formatter的StreamHandler组成。

如果需要自定义日志记录设置,则Flask logging documentation使用Python的example引用logging.config.dictConfig并建议尽快在程序中进行自定义设置:

当您要为项目配置日志记录时,应该这样做
程序启动时尽快。如果访问app.logger
在配置日志记录之前,它将添加一个默认处理程序。如果
如果可能,请在创建应用程序对象之前配置日志记录。

如果只想更改默认处理程序的输出格式,则只需设置一个新的格式化程序,并用所需的格式对其进行初始化:

import logging
from flask import Flask, logging as flog

app = Flask(__name__)

@app.route("/")
def random_name():
    app.logger.info("default flask logging format")
    flog.default_handler.setFormatter(logging.Formatter("%(message)s"))
    app.logger.info("message-only custom format")
    return "random value"

产生以下输出

[2019-03-26 14:42:06,511] INFO in main: default flask logging format
message-only custom format

Python 3 logging docs

编辑
事实证明,Flask的日志记录设置已被this commit进行了显着更改,而似乎已在1.0版本中引入了default_handler。对于较旧的版本,您可以使用以下解决方案:

app.logger.handlers[0].setFormatter(logging.Formatter("%(message)s"))

我想指出的是,这种方法在本机handlers对象上使用了未公开的Logger属性。虽然没有将其定义为私有的,但我仍然会警惕在生产代码中使用它。此解决方案还依赖于StreamHandler作为第一个添加到记录器的方法。

无论如何,首选的方法是干净的专用日志记录设置(如我链接的Flask文档中所述)。

Flask模板中的全局变量 - python

可能不是准确的标题,因为我是flask / python的新手。我正在开发一种内部工具,供不同团队使用。每个团队都有不同的部署阶段,例如alpha,beta|test,prod,并且它们还具有多个区域,例如NA,EU,AP等。现在,当我使用redirect_template时,我将发送stage和region作为变量,然后在模板中使用它们。但是,对每个red…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Flask-RESTful-返回自定义响应格式 - python

我已经按照以下Flask-RESTful文档定义了自定义响应格式。app = Flask(__name__) api = restful.Api(app) @api.representation('application/octet-stream') def binary(data, code, headers=None): resp =…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…