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
相关产品推荐
相关产品推荐

