Flask默认Logger日志缺失时间戳问题咨询
Flask默认日志无时间戳问题解决
问题描述
在Flask应用中使用默认Logger,查看Flask源码确认默认格式化器包含时间戳,但通过gunicorn启动应用时,自定义日志仅显示级别、来源和消息,缺失时间戳;而gunicorn自身的日志却正常显示时间戳。
控制器代码:
from flask import request from flask_restful import Resource from flask import current_app as app class HealthCheckController(Resource): def __init__(self): pass def get(self): app.logger.info("added logs here")
日志输出示例:
[2023-01-02 16:27:46 +0530] [77757] [INFO] Starting gunicorn 20.1.0 [2023-01-02 16:27:46 +0530] [77757] [INFO] Listening at: http://0.0.0.0:8080 (77757) [2023-01-02 16:27:46 +0530] [77757] [INFO] Using worker: sync [2023-01-02 16:27:46 +0530] [77758] [INFO] Booting worker with pid: 77758 [2023-01-02 16:27:46 +0530] [77759] [INFO] Booting worker with pid: 77759 [2023-01-02 16:27:46 +0530] [77760] [INFO] Booting worker with pid: 77760 [2023-01-02 16:27:46 +0530] [77761] [INFO] Booting worker with pid: 77761 INFO:src:added logs here
问题原因
使用gunicorn启动Flask应用时,gunicorn会初始化Python的logging模块,替换掉Flask默认的日志配置,导致Flask自带的带时间戳格式化器未被应用到日志处理器上。
解决方案
方案1:手动配置Flask日志格式化器
在Flask应用初始化阶段,重新配置日志处理器,确保使用带时间戳的格式化规则:
import logging from flask import Flask app = Flask(__name__) # 定义带时间戳的日志格式 log_format = '%(asctime)s %(levelname)s:%(name)s:%(message)s' formatter = logging.Formatter(log_format) # 为Flask默认日志处理器设置格式化器 for handler in app.logger.handlers: handler.setFormatter(formatter) # 若默认处理器被gunicorn移除,可添加新的处理器 handler = logging.StreamHandler() handler.setFormatter(formatter) app.logger.addHandler(handler) app.logger.setLevel(logging.INFO)
方案2:配置gunicorn统一日志格式
启动gunicorn时通过命令行参数指定日志格式,让所有日志(包括Flask自定义日志)统一使用带时间戳的格式:
gunicorn --log-format='%(asctime)s %(levelname)s:%(name)s:%(message)s' 你的应用模块名:app
也可以在gunicorn配置文件(如gunicorn.conf.py)中设置:
log_format = '%(asctime)s %(levelname)s:%(name)s:%(message)s'
方案3:禁用gunicorn日志配置,让Flask接管
启动gunicorn时添加--disable-logging参数,阻止gunicorn修改日志配置,保留Flask默认的带时间戳日志格式:
gunicorn --disable-logging 你的应用模块名:app
注意:此方式会关闭gunicorn自身的日志输出,需确保Flask的日志配置能覆盖所有必要的日志场景。
内容的提问来源于stack exchange,提问作者Dhanendra
相关产品推荐
相关产品推荐

