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

Flask部署的Python应用日志异常:无法写入对应日志文件

解决Flask应用中日志写入错误文件的问题

我猜你遇到的问题根源在于logging.basicConfig的工作机制——这个函数只会生效一次,当你第一次调用它配置日志后,后续的调用都会被忽略。所以不管你调用method_one()还是method_two(),日志最终都会写入第一次配置的那个文件里。

正确的解决方案:使用独立的Logger实例

我们应该为每个方法创建独立的Logger对象,并分别绑定对应的FileHandler,而不是依赖全局的basicConfig。这样每个方法的日志都会精准写入目标文件。

修改后的my_flask.py示例代码如下:

from flask import Flask, request
import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)

# 初始化两个独立的Logger
def get_method_one_logger():
    logger = logging.getLogger('method_one_logger')
    logger.setLevel(logging.INFO)
    # 避免重复添加Handler
    if not logger.handlers:
        handler = RotatingFileHandler('method_one.log', maxBytes=1024*1024, backupCount=5)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    return logger

def get_method_two_logger():
    logger = logging.getLogger('method_two_logger')
    logger.setLevel(logging.INFO)
    if not logger.handlers:
        handler = RotatingFileHandler('method_two.log', maxBytes=1024*1024, backupCount=5)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    return logger

def method_one():
    logger = get_method_one_logger()
    logger.info("This is a log from method_one")
    return "Method One Executed"

def method_two():
    logger = get_method_two_logger()
    logger.info("This is a log from method_two")
    return "Method Two Executed"

@app.route('/process', methods=['POST'])
def process_data():
    input_data = request.json.get('input_data')
    if input_data == "one":
        return method_one()
    else:
        return method_two()

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

关键说明:

  • 每个Logger通过唯一的名称(比如method_one_logger)区分,避免相互干扰。
  • 添加if not logger.handlers判断是为了防止每次调用方法时重复添加Handler,导致同一条日志被多次写入。
  • 使用RotatingFileHandler可以防止日志文件过大,你也可以直接用FileHandler如果不需要切割日志。
  • 根Logger的配置不会影响这些独立的Logger实例,保证了每个方法日志的独立性。

这样修改后,当input_data=="one"时,日志会写入method_one.log;其他情况则写入method_two.log,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:53:56