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

