【问题标题】:Formatting Flask app logs in json在 json 中格式化 Flask 应用程序日志
【发布时间】:2015-06-19 19:00:33
【问题描述】:

我正在使用 Python/Flask 应用程序并尝试在 json 中(按行)格式化日志。

使用 python-json-logger 包,我修改了 app.logger 的格式化程序如下:

from pythonjsonlogger import jsonlogger
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)')
app.logger.handlers[0].setFormatter(formatter)

这按预期工作。任何传递给 app.logger 的消息都以 json 格式正确显示。

但是,应用程序也会自动记录所有请求。此信息在标准输出中显示如下:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 -

我也希望将这些信息格式化为 json。我一直在寻找负责创建此输出的记录器/代码,但没有成功。

这个输出是在哪里生成的? 是否有更改此记录信息格式的机制?

【问题讨论】:

  • 您看到的这些日志可能来自您正在使用的 Web 服务器,而不是来自您的 wsgi 应用程序。您使用的是哪个服务器?
  • @MartijnPieters 你可能是对的,但Flask 记录访问请求是没有意义的,因为它不应该是它的工作
  • @sirfz:除了,它没有。事实上你是对的。

标签: python flask gunicorn


【解决方案1】:

当你第一次使用app.logger 属性时,Flask 会设置一些日志处理程序:

  • 设置为日志级别 DEBUG 并在 app.debug 为 true 时过滤的调试记录器。
  • 一个设置为ERROR的生产记录器。

您可以自己再次删除这些处理程序,方法是运行:

app.logger.handlers[:] = []

但是,您看到的日志行不是由 Flask 记录的,而是由 WSGI 服务器记录的。内置的 Werkzeug 服务器(在您使用 app.run() 时使用)和其他各种 WSGI 服务器都执行此操作。例如 Gunicorn 使用默认的 Python 记录器来记录访问。

永远不要在生产环境中使用内置的 WSGI 服务器(它不会很好地扩展,也没有针对恶意攻击者的战斗力)。

对于 Gunicorn,您可以禁用 日志传播 以保持日志记录分开:

logging.getLogger('gunicorn').propagate = False

【讨论】:

    【解决方案2】:

    Flask 内部使用werkzeug server。这些日志是由它打印的,而不是烧瓶。您可以使用logging.getLogger('werkzeug') 访问 werkzeug 记录器并根据需要进行配置。例如:

    werkzeug = logging.getLogger('werkzeug')
    if len(werkzeug.handlers) == 1:
        formatter = logging.Formatter('%(message)s', '%Y-%m-%d %H:%M:%S')
        werkzeug.handlers[0].setFormatter(formatter)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多