我想将Flask的日志记录格式更改为控制台,并且我尝试了这一点,
Provide extra information to Flask's app.logger
但这对我没有用;它有3年以上的历史了,也许是过时的了?
我可以添加一个附加的控制台处理程序,该命令可以正常工作,但是随后我会从flask默认控制台处理程序中获取一次重复的输出,并从添加的处理程序中获得一次输出。
来源
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 -
答案 0 :(得分:2)
在Flask 1.1.x中,关键是在创建应用程序对象之前配置日志记录。
要为项目配置日志记录时,应在程序启动时尽快进行记录。如果在配置日志记录之前访问了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__)
之前被调用。
答案 1 :(得分:0)
如果要替换记录器格式,则需要删除以前的记录器处理程序。
app.logger.handlers.clear()
app.logger.addHandler(consoleHandler)
https://code.luasoftware.com/tutorials/flask/change-flask-logging-output-format/