Flask stderr打印到文件



我希望我的python烧瓶项目有stderr打印,表示";txt";,以及stdout到"0";"stoud.txt";

我看过print("debug stderr", sys.stderr(file)),但我不明白它的意思。我不希望stderr转到特定的命令,我希望所有烧瓶都打印到stderr.txtstoud.txt。例如,当我运行python app.py时,我希望能够执行cat stderr.txt并只看到错误,而当我运行cat stoud.txt时,我则希望看到输出。没有stdin。

提前感谢:(

据我所知(需要仔细检查(Werkzeug没有使用命名记录器而使用根记录器,因此可以通过传递不同的处理程序来更改根记录器的行为:

from flask import Flask
import logging
from logging.handlers import RotatingFileHandler
app = Flask(__name__)
class LevelFilter(object):
def __init__(self, level):
self.level = level
def filter(self, record):
return record.levelno != self.level
# Redirect stdout and stderr to files
info_handler = RotatingFileHandler("info.log", backupCount=1)
info_handler.setLevel(logging.INFO)
# Don't print stack trace in info.log - optional
info_handler.addFilter(LevelFilter(logging.ERROR))
error_handler = RotatingFileHandler("err.log", backupCount=1)
error_handler.setLevel(logging.ERROR)
logging.root.handlers = [info_handler, error_handler]
@app.route("/")
def hello_world():
return "Hello, world"

@app.route("/error")
def error():
len(m)  # Some dumb error
return "No wonder it crashed..."

if __name__ == "__main__":
app.run(port=8080, debug=False)

运行此应用程序并访问/将在info.log中产生以下输出:

* Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
127.0.0.1 - - [06/Oct/2020 15:57:11] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [06/Oct/2020 15:57:21] "[35m[1mGET /error HTTP/1.1[0m" 500 -

访问/error将打印err.log:中错误的堆栈跟踪

Exception on /error [GET]
Traceback (most recent call last):
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/anddt/.pyenv/versions/3.8.6/envs/flask-log/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "app.py", line 16, in error
len(m)  # Some dumb error
NameError: name 'm' is not defined

如果您不介意错误堆栈跟踪出现在两个日志中,那么您显然可以省去将过滤器添加到处理程序中的麻烦。

最新更新