Flask中如何让独立模块与主模块日志同时输出到控制台和文件?
解决Flask应用中模块日志不输出及多渠道日志配置问题
我来帮你快速搞定这个问题!你的情况其实有两个核心原因:
- Flask自带的日志配置只作用于它自己的
APP.logger,而util模块里的独立日志器(logger)没被配置输出渠道(控制台+文件); util里的日志器默认级别是WARNING,所以你写的info级别的日志会被直接过滤掉,根本不会进入输出环节。
下面是最简单的实现方案,只需要修改你的主Flask文件,util模块完全不用动:
from flask import Flask import util import logging from logging.handlers import RotatingFileHandler # 用滚动日志文件更实用,避免文件过大 APP = Flask("app") APP.debug = True def setup_logging(): # 获取根日志器,所有模块的日志器都会继承它的配置 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # 设置最低日志级别为INFO,确保info及以上日志能被处理 # 定义日志格式,包含时间、日志器名称、级别和消息 log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 配置控制台输出handler console_handler = logging.StreamHandler() console_handler.setFormatter(log_formatter) root_logger.addHandler(console_handler) # 配置文件输出handler,这里用滚动文件,单个文件最大1MB,最多保留5个备份 file_handler = RotatingFileHandler( 'app.log', maxBytes=1024 * 1024, backupCount=5, encoding='utf-8' ) file_handler.setFormatter(log_formatter) root_logger.addHandler(file_handler) # 初始化日志配置 setup_logging() @APP.route('/', methods=['GET']) def index(): APP.logger.info("info message from index") util.test() return "hello world" if __name__ == '__main__': APP.run()
为什么这样能解决问题?
- 根日志器配置继承:我们直接配置了Python日志系统的根日志器,
APP.logger和util里的logging.getLogger(__name__)都是根日志器的子日志器,会自动继承根日志器的级别和输出handler,这样两个模块的日志都会同时输出到控制台和文件。 - 日志级别统一设置:根日志器设置为
INFO级别,所有子日志器如果没有单独设置级别,都会继承这个级别,这样util里的info日志就不会再被过滤了。
测试效果
运行你的Flask应用后,访问根路径/,你会看到控制台同时输出两条日志,同时项目目录下会生成app.log文件,里面也会包含这两条日志内容。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

