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

Flask请求日志模块多请求并发打印内容混乱问题求助

解决Flask多请求下日志输出行混乱问题

问题原因

Flask默认采用多线程模式处理并发请求,而print()函数并非线程安全的原子操作——当多个线程同时调用print()时,不同线程的输出内容会被打断、交错,最终导致日志行混乱。

解决方案

1. 用Python标准logging模块替代print

logging模块的输出操作是线程安全的,能从根源避免多线程输出交错问题,同时支持更灵活的日志配置。示例代码:

import logging
from flask import Flask, request
from datetime import datetime

app = Flask(__name__)

# 配置日志格式,包含时间、状态码、请求路径等信息
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - 状态码: %(status_code)s - 请求路径: %(path)s',
    handlers=[logging.StreamHandler()]
)
logger = logging.getLogger(__name__)

@app.after_request
def log_request(response):
    # 传递自定义日志字段
    extra = {
        'status_code': response.status_code,
        'path': request.path
    }
    logger.info('请求处理完成', extra=extra)
    return response

2. 给print操作添加线程锁

如果必须使用print,可以通过线程锁保证同一时间只有一个线程执行输出操作:

from flask import Flask, request
from datetime import datetime
import threading

app = Flask(__name__)
# 创建全局线程锁
print_lock = threading.Lock()

@app.after_request
def log_request(response):
    log_content = f"{datetime.now()} - 状态码: {response.status_code} - 请求路径: {request.path}"
    # 加锁确保print操作原子性
    with print_lock:
        print(log_content)
    return response

3. 使用Flask内置的app.logger

Flask已集成标准logging模块,直接使用app.logger即可获得线程安全的日志输出:

from flask import Flask, request
from datetime import datetime

app = Flask(__name__)

@app.after_request
def log_request(response):
    log_msg = f"{datetime.now()} - 状态码: {response.status_code} - 请求路径: {request.path}"
    app.logger.info(log_msg)
    return response

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:15:03