仅记录到文件,不记录日志。DEBUG

问题描述 投票:0回答:1

我有以下脚本,我只希望将“ DEBUG”日志消息记录到文件中,而什么都不记录到屏幕中。

from flask import Flask, request, jsonify
from gevent.pywsgi import WSGIServer
import usaddress
app = Flask(__name__)

from logging.handlers import RotatingFileHandler
import logging
#logging.basicConfig(filename='error.log',level=logging.DEBUG)


# create a file to store weblogs
log = open('error.log', 'w'); log.seek(0); log.truncate();
log.write("Web Application Log\n"); log.close();

log_handler = RotatingFileHandler('error.log', maxBytes =1000000, backupCount=1)

formatter = logging.Formatter(
    "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s"
    )
log_handler.setFormatter(formatter)
app.logger.setLevel(logging.DEBUG)
app.logger.addHandler(log_handler)

@app.route('/')
def hello():
  return "Hello World!"

@app.route("/parseAddress", methods=["POST"])
def parseAddress():
  address = request.form['address']
  return jsonify(usaddress.tag(address)), 200

if __name__ == '__main__':
#  app.run(host='0.0.0.0')
  http_server = WSGIServer(('', 5000), app, log=app.logger)
  http_server.serve_forever()

但是现在甚至“ INFO”消息都被记录到文件和屏幕上。如何只将“调试”消息记录到文件中,而什么都没有记录到屏幕上?

python gevent
1个回答
1
投票

我进行了一些交互式测试,看起来app.logger是一个以python文件命名的记录器

print(app.logger.name) # filename

它有一个处理程序

print(app.logger.handlers) # [<StreamHandler <stderr> (NOTSET)>]

级别为logging.NOTSET的处理程序处理所有消息(来自所有日志记录级别)。因此,当您设置app.logger.setLevel(logging.DEBUG)时,所有调试和更高级别的日志都将传递给处理程序,并且所有它们都将出现在stderr上。

要在屏幕上完全不记录任何内容,您必须手动删除StreamHandler:

app.logger.handlers.pop(0)

并且还要在处理程序上将DEBUG和更高版本记录到文件集的记录级别

log_handler.setLevel(logging.DEBUG)

Python日志记录非常复杂。请参阅此logging flow chart以更好地了解发生了什么:)

编辑:仅记录一个特定级别,您需要自定义过滤器对象:

class LevelFilter:
    def __init__(self, level):
        self._level = level

    def filter(self, log_record):
        return log_record.levelno == self._level

log_handler.setLevel(logging.DEBUG)
log_handler.addFilter(LevelFilter(logging.DEBUG))
© www.soinside.com 2019 - 2024. All rights reserved.