Flask应用中如何让自定义Logger在所有文件中可用?
问题分析与解决
你的日志无输出主要源于几个问题:未配置日志输出处理器与级别、flask_log_request_id扩展未初始化、LoggerFilter的上下文依赖问题,以及可能存在的APP实例不统一。以下是分步解决方案:
1. 修正日志配置与扩展初始化
修改logger.py,完成日志输出配置、请求ID扩展初始化,同时兼容非请求场景的日志调用:
import logging from flask import Flask from flask_log_request_id import RequestID, current_request_id # 全局APP实例,所有路由需导入该实例 APP = Flask(__name__) # 初始化请求ID扩展,确保能获取request_id RequestID(APP) class LoggerFilter(logging.Filter): def filter(self, record): # 处理非请求上下文场景,避免报错 try: record.request_id = current_request_id() except RuntimeError: record.request_id = "no-request-id" return True # 配置日志基础参数 logger = logging.getLogger(__name__) # 设置日志级别为INFO,确保info及以上级别日志被处理 logger.setLevel(logging.INFO) # 创建控制台输出处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 定义包含request_id的日志格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - RequestID: %(request_id)s - %(message)s') console_handler.setFormatter(formatter) # 给logger添加过滤器和输出处理器 logger.addFilter(LoggerFilter()) logger.addHandler(console_handler)
2. 统一APP实例与路由配置
在路由文件中,必须导入logger.py中的全局APP实例,禁止自行创建新的Flask对象:
from logger import logger, APP @APP.route("/", methods=['GET']) def get_list(): logger.info("Hello") return "Hello World" if __name__ == "__main__": APP.run(debug=True)
3. 验证效果
启动Flask应用后,访问http://localhost:5000,终端会输出包含request_id的日志:
2024-05-20 14:23:45,678 - logger - INFO - RequestID: xyz789 - Hello
此时你可以在任何导入该logger的文件中使用它,日志都会自动带上request_id字段。
内容的提问来源于stack exchange,提问作者devumesh
相关产品推荐
相关产品推荐

