【问题标题】:flask python internal logger not printing to log or console烧瓶python内部记录器不打印到日志或控制台
【发布时间】:2025-11-30 15:10:02
【问题描述】:

我正在运行烧瓶应用程序,但出现内部错误: C:\Python36-64\Lib\site-packages\flask_wtf\csrf.py

 except ValidationError as e:
            logger.info(e.args[0])
            raise

问题是我在任何地方都看不到这个 logger.info .. 在我的烧瓶应用程序中,我将记录器定义为:

logger = logging.getLogger('werkzeug')
logger.setLevel(logging.DEBUG)
logsdir = 'logs/'
handler = RotatingFileHandler(logsdir + "log.log")
# Create Error handler
error_handler = RotatingFileHandler(logsdir + "error_logger.log")
error_handler.setLevel(logging.ERROR)
logger.addHandler(handler)
logger.addHandler(error_handler)
logger.addHandler(default_handler)
app.logger.addHandler(handler)

【问题讨论】:

    标签: python-3.x flask logging


    【解决方案1】:

    您可能可以将其移动到 Flask 中。您还可以查看 Flask 中的全局异常处理:https://flask.palletsprojects.com/en/1.1.x/errorhandling/。 下面是在请求之前配置记录器的代码。

    @app.before_first_request
    def setup_logging():
        if not app.debug:
            # In production mode, add log handler to sys.stdout.
            app.logger.handlers.pop()
            if not app.logger.hasHandlers():
                handler = logging.StreamHandler(sys.stdout)
                handler.setFormatter(logging.Formatter(
                    '%(asctime)s - [%(levelname)s] - [%(thread)d] - [%(threadName)s] - %(name)s  - %(message)s'))
                app.logger.addHandler(handler)
                app.logger.setLevel(logging.DEBUG)
                app.logger.propagate = False
                app.logger.propagate = False
                app.logger.handler_set = True
            return app.logger
    

    全局异常处理程序,来自 Flask 文档的示例。

    from flask import json
    from werkzeug.exceptions import HTTPException
    
    @app.errorhandler(HTTPException)
    def handle_exception(e):
        """Return JSON instead of HTML for HTTP errors."""
        # start with the correct headers and status code from the error
        response = e.get_response()
        # replace the body with JSON
        response.data = json.dumps({
            "code": e.code,
            "name": e.name,
            "description": e.description,
        })
        response.content_type = "application/json"
        return response
    

    另外。查看回溯以获取更多跟踪信息:

            try:
               return fetch_some_from_db(), 200
            except NoResultFound as ex:
                LOGGER.error("Received exception in DeleteResource: {}".format(ex))
                traceback.print_exc()
                db.session.rollback()
                db.session.close()
                # handle_failure(interface, message, message_json)
                return DEFAULT_FAILURE_MESSAGE_NO_MAPPING, 400
    

    【讨论】:

    • 我想你可以从@app.before_first_request 开始看看。