【问题标题】:flask logging duplicate output烧瓶记录重复输出
【发布时间】:2018-07-02 21:45:28
【问题描述】:

我想把flask的日志格式改成控制台,我试过了,

Provide extra information to Flask's app.logger

但这对我不起作用;它已有 3 年以上的历史,可能已经过时了?

我可以添加一个额外的控制台处理程序,它可以工作,但是我得到重复的输出,一次来自烧瓶默认控制台处理程序,一次来自我添加的处理程序。

来源,

import sys
import logging
from flask import Flask


def setup_logging(level=logging.INFO):

    # FIXME: logs are coming out "twice", once with the format from flask, and again from
    #        the format from consoleHandler.  app.logger level and the console handler
    #        level seem to be linked
    app.logger.setLevel(level)

    # Here we define our formatter
    FORMAT = "%(relativeCreated)6d %(threadName)15s %(filename)25s:%(lineno)4s - %(name)30s:%(funcName)20s() %(levelname)-5.5s : %(message)s"
    formatter = logging.Formatter(FORMAT)

    consoleHandler = logging.StreamHandler(stream=sys.stdout)
    consoleHandler.setFormatter(formatter)
    consoleHandler.setLevel(level)

    app.logger.addHandler(consoleHandler)

    # this did not work :(
    # https://stackoverflow.com/questions/27775026/provide-extra-information-to-flasks-app-logger


app = Flask(__name__)

@app.route('/')
def hello_world():
    app.logger.info("Foo Bar")
    return 'Hello, World!'


setup_logging()

app.run(host="0.0.0.0", port=6800, debug=False)

输出,

 * Serving Flask app "SO_log_01" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:6800/ (Press CTRL+C to quit)
[2018-07-02 17:35:52,906] INFO in SO_log_01: Foo Bar
127.0.0.1 - - [02/Jul/2018 17:35:52] "GET / HTTP/1.1" 200 -
  5083        Thread-1              SO_log_01.py:  39 -                      flask.app:         hello_world() INFO  : Foo Bar
127.0.0.1 - - [02/Jul/2018 17:35:55] "GET /favicon.ico HTTP/1.1" 404 -

【问题讨论】:

    标签: python-3.x flask


    【解决方案1】:

    如果要替换记录器格式,则需要删除以前的记录器处理程序。

    app.logger.handlers.clear()
    app.logger.addHandler(consoleHandler)
    

    https://code.luasoftware.com/tutorials/flask/change-flask-logging-output-format/

    【讨论】:

      【解决方案2】:

      在 Flask 1.1.x 中,关键是在创建应用程序对象之前配置您的日志记录。

      Basic Configuration

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

      一个工作示例。

      import os
      from flask import Flask
      from logging.config import dictConfig
      
      dictConfig({
          'version': 1,
          'formatters': {
              'default': {
                  'format': '%(asctime)s.%(msecs)03d, %(levelname)s, %(message)s',
                  'datefmt': '%Y-%m-%dT%H:%M:%S'
              },
          },
          'handlers': {
              'stdout': {
                  'class': "logging.StreamHandler",
                  'stream': 'ext://sys.stdout',
                  'formatter': 'default'
              }
          },
          'root': {
              'handlers': ['stdout'],
              'level': os.getenv('APP_LOG_LEVEL', 'INFO')},
      })
      
      app = Flask(__name__)
      app.logger.info("App started")
      
      
      @app.route('/')
      def hello_world():
          app.logger.info("Foo Bar")
          return 'Hello, World!'
      

      运行它并通过点击http://localhost:5000/ 几次来获得一些输出。

      $ FLASK_APP=app.py FLASK_ENV=development APP_LOG_LEVEL=DEBUG flask run
       * Serving Flask app "app.py" (lazy loading)
       * Environment: development
       * Debug mode: on
      2020-04-20T14:35:46.480, INFO, App started
      2020-04-20T14:35:46.486, INFO,  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
      2020-04-20T14:35:46.487, INFO,  * Restarting with stat
      2020-04-20T14:35:47.024, INFO, App started
      2020-04-20T14:35:47.028, WARNING,  * Debugger is active!
      2020-04-20T14:35:47.035, INFO,  * Debugger PIN: 329-665-000
      2020-04-20T14:35:54.362, INFO, Foo Bar
      2020-04-20T14:35:54.363, INFO, 127.0.0.1 - - [20/Apr/2020 14:35:54] "GET / HTTP/1.1" 200 -
      2020-04-20T14:35:54.879, INFO, Foo Bar
      2020-04-20T14:35:54.880, INFO, 127.0.0.1 - - [20/Apr/2020 14:35:54] "GET / HTTP/1.1" 200 -
      2020-04-20T14:35:55.356, INFO, Foo Bar
      2020-04-20T14:35:55.356, INFO, 127.0.0.1 - - [20/Apr/2020 14:35:55] "GET / HTTP/1.1" 200 -
      

      要理解的关键是dictConfig(...)Flask(__name__) 之前被调用。

      【讨论】:

      • 这是官方文档,对我不起作用
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2017-06-27
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多