You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用日志未输出预期格式,问题排查求助

问题

我尝试为INFO级日志设置特定格式,为DEBUG级日志使用默认格式。以下是配置logger及其处理器的代码:

logger = logging.getLogger("__name__")
logging.basicConfig( level=logging.DEBUG)

debugHandler = logging.StreamHandler(sys.stdout)
debugHandler.setLevel(logging.DEBUG)

infoHandler = logging.StreamHandler(sys.stdout)
infoHandler.setLevel(logging.INFO)
f2 = logging.Formatter("%(levelname)s:%(name)s:%(asctime)s:%(message)s", "%m/%d/%Y %H:%M:%S")
infoHandler.setFormatter(f2)

logger.addHandler(debugHandler)
logger.addHandler(infoHandler)

调用日志的代码:

@app.route('/about')
def about():
    app.logger.info('"About Us" page retrieved')
    return render_template('about.html')

实际输出:

INFO:app:"About Us" page retrieved
INFO:werkzeug:192.168.4.31 - - [06/Sep/2022 23:48:05] "GET /about HTTP/1.1" 200-

期望输出:

INFO:app:09/06/2022 23:48:05:"About Us" page retrieved

请问我哪里操作出错了?

解决方法

1. 日志实例不匹配

你代码里创建的是名为__name__的独立logger,但实际业务中调用的是Flask内置的app.logger,两者不是同一个实例,导致你的处理器配置完全没作用在实际输出的日志上。

2. 处理器无过滤规则,会重复输出

当前配置下,INFO级日志会同时被debugHandler和infoHandler处理:前者用默认格式输出,后者用自定义格式输出,最终会产生重复日志。必须给处理器添加过滤规则,让每个处理器只处理对应级别的日志。

3. 默认处理器干扰输出

logging.basicConfig会给根logger自动添加一个默认的StreamHandler,导致日志被额外输出,需要先移除Flask logger自带的默认处理器。

修正后的代码示例

import logging
from flask import Flask, render_template
import sys

app = Flask(__name__)

# 获取Flask内置的app.logger,而非新建独立logger
logger = app.logger
# 移除默认处理器,避免重复输出
for handler in logger.handlers[:]:
    logger.removeHandler(handler)

# 配置DEBUG处理器:仅处理DEBUG级日志
debugHandler = logging.StreamHandler(sys.stdout)
debugHandler.setLevel(logging.DEBUG)
# 添加过滤器,只放行DEBUG级日志
class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG
debugHandler.addFilter(DebugFilter())

# 配置INFO处理器:处理INFO及以上级别,使用自定义格式
infoHandler = logging.StreamHandler(sys.stdout)
infoHandler.setLevel(logging.INFO)
f2 = logging.Formatter("%(levelname)s:%(name)s:%(asctime)s:%(message)s", "%m/%d/%Y %H:%M:%S")
infoHandler.setFormatter(f2)

logger.addHandler(debugHandler)
logger.addHandler(infoHandler)
# 设置logger全局级别为DEBUG,确保所有级别日志能被处理器接收
logger.setLevel(logging.DEBUG)

@app.route('/about')
def about():
    app.logger.info('"About Us" page retrieved')
    app.logger.debug('Debug message test') # 测试DEBUG级日志输出
    return render_template('about.html')

if __name__ == '__main__':
    app.run()

修改后,INFO级日志会按你定义的格式输出,DEBUG级日志保留默认格式,且不会出现重复日志。

内容的提问来源于stack exchange,提问作者Mayukh Chakravartti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:25:29